OkHttpUtils.java 11 KB

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