OkHttpUtils.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. package com.fdkk.sxz.util;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import cn.hutool.http.HttpRequest;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fdkk.sxz.Interceptor.OkHttpLogInterceptor;
  7. import okhttp3.*;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.http.HttpMethod;
  11. import org.springframework.scheduling.annotation.AsyncResult;
  12. import org.springframework.util.CollectionUtils;
  13. import java.io.IOException;
  14. import java.util.Map;
  15. import java.util.concurrent.Future;
  16. import java.util.concurrent.TimeUnit;
  17. import java.util.function.Consumer;
  18. /**
  19. * @author axin
  20. * @since 2019-08-14
  21. */
  22. public class OkHttpUtils {
  23. private static final Logger log = LoggerFactory.getLogger(OkHttpUtils.class);
  24. private static final String HTTP_JSON = "application/json; charset=utf-8";
  25. private static final String HTTP_FORM = "application/x-www-form-urlencoded; charset=utf-8";
  26. private static final OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new OkHttpLogInterceptor())
  27. .connectTimeout(3000, TimeUnit.SECONDS)
  28. .readTimeout(3000, TimeUnit.SECONDS)
  29. .writeTimeout(3000, TimeUnit.SECONDS)
  30. .build();
  31. /**
  32. * 同步 POST调用 无Header
  33. *
  34. * @param url
  35. * @param paramsMap
  36. * @return
  37. */
  38. public static String httpPostForm(String url, Map<String, String> paramsMap) {
  39. if (url == null || "".equals(url)) {
  40. log.error("url为null!");
  41. return "";
  42. }
  43. // 添加请求类型
  44. MultipartBody.Builder builder = new MultipartBody.Builder();
  45. builder.setType(MediaType.parse("multipart/form-data"));
  46. // 追加表单信息
  47. paramsMap.forEach((String key, String value) -> builder.addFormDataPart(key, value));
  48. RequestBody formBody = builder.build();
  49. Request.Builder requestBuilder = new Request.Builder().url(url);
  50. Request request = requestBuilder.post(formBody).build();
  51. try {
  52. Response response = okHttpClient.newCall(request).execute();
  53. if (response.code() == 200) {
  54. log.info("http PostForm 请求成功; [url={}, requestContent={}]", url, paramsMap.toString());
  55. return response.body().string();
  56. } else {
  57. log.warn("Http PostForm 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, paramsMap.toString());
  58. }
  59. } catch (IOException e) {
  60. throw new RuntimeException("同步http请求失败,url:" + url, e);
  61. }
  62. return null;
  63. }
  64. /**
  65. * 同步 POST调用 有Header
  66. *
  67. * @param url
  68. * @param paramsMap
  69. * @param headers
  70. * @return
  71. */
  72. public static String httpPostForm(String url, Map<String, String> paramsMap, Map<String, String> headers) {
  73. if (url == null || "".equals(url)) {
  74. log.error("url为null!");
  75. return "";
  76. }
  77. // 添加请求类型
  78. MultipartBody.Builder builder = new MultipartBody.Builder();
  79. builder.setType(MediaType.parse("multipart/form-data"));
  80. // 追加表单信息
  81. paramsMap.forEach((String key, String value) -> builder.addFormDataPart(key, value));
  82. RequestBody formBody = builder.build();
  83. Request.Builder requestBuilder = new Request.Builder().url(url);
  84. if (headers != null && headers.size() > 0) {
  85. headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
  86. }
  87. Request request = requestBuilder.post(formBody).build();
  88. try {
  89. Response response = okHttpClient.newCall(request).execute();
  90. if (response.code() == 200) {
  91. log.info("http PostForm 请求成功; [url={}, requestContent={}]", url, paramsMap.toString());
  92. return response.body().string();
  93. } else {
  94. log.warn("Http PostForm 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, paramsMap.toString());
  95. }
  96. } catch (IOException e) {
  97. throw new RuntimeException("同步http请求失败,url:" + url, e);
  98. }
  99. return null;
  100. }
  101. /**
  102. * get请求
  103. * 对于小文档,响应体上的string()方法非常方便和高效。
  104. * 但是,如果响应主体很大(大于1 MB),则应避免string(),
  105. * 因为它会将整个文档加载到内存中。在这种情况下,将主体处理为流。
  106. *
  107. * @param url
  108. * @return
  109. */
  110. public static String httpGet(String url) throws Exception {
  111. if (url == null || "".equals(url)) {
  112. log.error("url为null!");
  113. return "";
  114. }
  115. Request.Builder builder = new Request.Builder();
  116. Request request = builder.get().url(url).build();
  117. Response response = okHttpClient.newCall(request).execute();
  118. if (response.code() == 200) {
  119. log.info("http GET 请求成功; [url={}]", url);
  120. return response.body().string();
  121. } else {
  122. log.warn("Http GET 请求失败; [errorCode = {} , url={}]", response.code(), url);
  123. }
  124. return null;
  125. }
  126. public static String httpGet(String url, Map<String, String> headers) throws Exception {
  127. if (CollectionUtils.isEmpty(headers)) {
  128. return httpGet(url);
  129. }
  130. Request.Builder builder = new Request.Builder();
  131. headers.forEach((String key, String value) -> builder.header(key, value));
  132. Request request = builder.get().url(url).build();
  133. Response response = okHttpClient.newCall(request).execute();
  134. if (response.code() == 200) {
  135. log.info("http GET 请求成功; [url={}]", url);
  136. return response.body().string();
  137. } else {
  138. log.warn("Http GET 请求失败; [errorxxCode = {} , url={}]", response.code(), url);
  139. }
  140. return null;
  141. }
  142. /**
  143. * 同步 POST调用 无Header
  144. *
  145. * @param url
  146. * @param json
  147. * @return
  148. */
  149. public static String httpPostJson(String url, String json) {
  150. if (url == null || "".equals(url)) {
  151. log.error("url为null!");
  152. return "";
  153. }
  154. MediaType JSON = MediaType.parse(HTTP_JSON);
  155. RequestBody body = RequestBody.create(JSON, json);
  156. Request.Builder requestBuilder = new Request.Builder().url(url);
  157. Request request = requestBuilder.post(body).build();
  158. try {
  159. Response response = okHttpClient.newCall(request).execute();
  160. if (response.code() == 200) {
  161. String returnStr = response.body().string();
  162. log.info("http Post 请求成功; [url={}, requestContent={},return={}]", url, json,returnStr);
  163. return returnStr;
  164. } else {
  165. log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={}]", response.code(), url, json);
  166. }
  167. } catch (IOException e) {
  168. throw new RuntimeException("同步http请求失败,url:" + url, e);
  169. }
  170. return null;
  171. }
  172. /**
  173. * 同步 POST调用 有Header
  174. *
  175. * @param url
  176. * @param json
  177. * @param headers
  178. * @return
  179. */
  180. public static JSONObject httpPostJson(String url, String json, Map<String, String> headers) {
  181. if (CollectionUtils.isEmpty(headers)) {
  182. httpPostJson(url, json);
  183. }
  184. MediaType mediaType = MediaType.parse(HTTP_JSON);
  185. RequestBody body = RequestBody.create(mediaType, json);
  186. Request.Builder requestBuilder = new Request.Builder().url(url);
  187. if (ObjectUtil.isNotNull(headers)) {
  188. headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
  189. }
  190. Request request = requestBuilder.post(body).build();
  191. try {
  192. Response response = okHttpClient.newCall(request).execute();
  193. if (response.code() == 200) {
  194. log.info("http Post 请求成功; [url={}, requestContent={} ,headers{}]", url, json, headers);
  195. return JSON.parseObject(response.body().string());
  196. } else {
  197. log.warn("Http POST 请求失败; [ errorCode = {}, url={}, param={},headers{}]", response.code(), url, json, headers);
  198. }
  199. } catch (IOException e) {
  200. throw new RuntimeException("同步http请求失败,url:" + url, e);
  201. }
  202. return null;
  203. }
  204. /**
  205. * 提交表单
  206. *
  207. * @param url
  208. * @param content
  209. * @param headers
  210. * @return
  211. */
  212. public static String postDataByForm(String url, String content, Map<String, String> headers) {
  213. MediaType JSON = MediaType.parse(HTTP_FORM);
  214. RequestBody body = RequestBody.create(JSON, content);
  215. Request.Builder requestBuilder = new Request.Builder().url(url);
  216. if (headers != null && headers.size() > 0) {
  217. headers.forEach((k, v) -> requestBuilder.addHeader(k, v));
  218. }
  219. Request request = requestBuilder
  220. .post(body)
  221. .build();
  222. Response response = null;
  223. try {
  224. response = okHttpClient.newCall(request).execute();
  225. if (response.code() == 200) {
  226. log.info("postDataByForm; [postUrl={}, requestContent={}, responseCode={}]", url, content, response.code());
  227. return response.body().string();
  228. } else {
  229. log.warn("Http Post Form请求失败,[url={}, param={}]", url, content);
  230. }
  231. } catch (IOException e) {
  232. log.error("Http Post Form请求失败,[url={}, param={}]", url, content, e);
  233. throw new RuntimeException("Http Post Form请求失败,url:" + url);
  234. }
  235. return null;
  236. }
  237. /**
  238. * 异步Http调用参考模板:Get、Post、Put
  239. * 需要异步调用的接口一般情况下你需要定制一个专门的Http方法
  240. *
  241. * @param httpMethod
  242. * @param url
  243. * @param content
  244. * @return
  245. */
  246. @Deprecated
  247. public static Future<Boolean> asyncHttpByJson(HttpMethod httpMethod, String url, Map<String, String> headers, String content) {
  248. MediaType JSON = MediaType.parse(HTTP_JSON);
  249. RequestBody body = RequestBody.create(JSON, content);
  250. Request.Builder requestBuilder = new Request.Builder()
  251. .url(url);
  252. if (!CollectionUtils.isEmpty(headers)) {
  253. headers.forEach((key, value) -> requestBuilder.header(key, value));
  254. }
  255. switch (httpMethod) {
  256. case GET:
  257. requestBuilder.get();
  258. break;
  259. case POST:
  260. requestBuilder.post(body);
  261. break;
  262. default:
  263. }
  264. Request request = requestBuilder.build();
  265. Call call = okHttpClient.newCall(request);
  266. call.enqueue(new Callback() {
  267. @Override
  268. public void onFailure(Call call, IOException e) {
  269. log.error("异步http {} 请求失败,[url={}, param={}]", httpMethod.name(), url, content);
  270. throw new RuntimeException("异步http请求失败,url:" + url);
  271. }
  272. @Override
  273. public void onResponse(Call call, final Response response) throws IOException {
  274. if (response.code() == 200) {
  275. System.out.println("需要加入异步回调操作");
  276. } else {
  277. log.error("异步http {} 请求失败,错误码为{},请求参数为[url={}, param={}]", httpMethod.name(), response.code(), url, content);
  278. }
  279. }
  280. });
  281. return new AsyncResult(true);
  282. }
  283. /**
  284. * lambda表达式异步调用http模板,不建议使用
  285. *
  286. * @param request
  287. * @param failure
  288. * @param respConsumer
  289. */
  290. public static void asyncCall(Request request, Consumer<Exception> failure, Consumer<Response> respConsumer) {
  291. okHttpClient.newCall(request).enqueue(new Callback() {
  292. @Override
  293. public void onFailure(Call call, IOException e) {
  294. failure.accept(e);
  295. }
  296. @Override
  297. public void onResponse(Call call, Response response) throws IOException {
  298. respConsumer.accept(response);
  299. }
  300. });
  301. }
  302. //test
  303. public static void main(String[] args) {
  304. // String url = "http://192.168.0.30:8000/pro";
  305. // JSONObject jsonObject = new JSONObject();
  306. // jsonObject.put("name", "vr-t-2KZ4MQv-001");
  307. // jsonObject.put("map", "t-2KZ4MQv");
  308. // jsonObject.put("resolution", 1024);
  309. // int num[] = new int[1];
  310. // num[0] = -1;
  311. // jsonObject.put("ids", num);
  312. // System.out.println(httpPostJson(url, jsonObject.toJSONString()));
  313. // System.out.println(httpGet("http://192.168.0.165:8000/check"));
  314. }
  315. }