当前位置:   article > 正文

SpringBoot教程(七)——集成Okhttp3_okhttp3 pom

okhttp3 pom

 1.pom依赖:

  1. <dependency>
  2. <groupId>com.squareup.okhttp3</groupId>
  3. <artifactId>okhttp</artifactId>
  4. <version>3.10.0</version>
  5. </dependency>

2.okhttp工具类:

  1. public class OkHttpUtils {
  2. private static volatile OkHttpClient okHttpClient = null;
  3. private static volatile Semaphore semaphore = null;
  4. private Map<String, String> headerMap;
  5. private Map<String, String> paramMap;
  6. private String url;
  7. private Request.Builder request;
  8. /**
  9. * 初始化okHttpClient,并且允许https访问
  10. */
  11. private OkHttpUtils() {
  12. if (okHttpClient == null) {
  13. synchronized (OkHttpUtils.class) {
  14. if (okHttpClient == null) {
  15. TrustManager[] trustManagers = buildTrustManagers();
  16. okHttpClient = new OkHttpClient.Builder()
  17. .connectTimeout(15, TimeUnit.SECONDS)
  18. .writeTimeout(20, TimeUnit.SECONDS)
  19. .readTimeout(20, TimeUnit.SECONDS)
  20. .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
  21. .hostnameVerifier((hostName, session) -> true)
  22. .retryOnConnectionFailure(true)
  23. .build();
  24. addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
  25. }
  26. }
  27. }
  28. }
  29. /**
  30. * 用于异步请求时,控制访问线程数,返回结果
  31. *
  32. * @return
  33. */
  34. private static Semaphore getSemaphoreInstance() {
  35. //只能1个线程同时访问
  36. synchronized (OkHttpUtils.class) {
  37. if (semaphore == null) {
  38. semaphore = new Semaphore(0);
  39. }
  40. }
  41. return semaphore;
  42. }
  43. /**
  44. * 创建OkHttpUtils
  45. *
  46. * @return
  47. */
  48. public static OkHttpUtils builder() {
  49. return new OkHttpUtils();
  50. }
  51. /**
  52. * 添加url
  53. *
  54. * @param url
  55. * @return
  56. */
  57. public OkHttpUtils url(String url) {
  58. this.url = url;
  59. return this;
  60. }
  61. /**
  62. * 添加参数
  63. *
  64. * @param key 参数名
  65. * @param value 参数值
  66. * @return
  67. */
  68. public OkHttpUtils addParam(String key, String value) {
  69. if (paramMap == null) {
  70. paramMap = new LinkedHashMap<>(16);
  71. }
  72. paramMap.put(key, value);
  73. return this;
  74. }
  75. /**
  76. * 添加请求头
  77. *
  78. * @param key 参数名
  79. * @param value 参数值
  80. * @return
  81. */
  82. public OkHttpUtils addHeader(String key, String value) {
  83. if (headerMap == null) {
  84. headerMap = new LinkedHashMap<>(16);
  85. }
  86. headerMap.put(key, value);
  87. return this;
  88. }
  89. /**
  90. * 初始化get方法
  91. *
  92. * @return
  93. */
  94. public OkHttpUtils get() {
  95. request = new Request.Builder().get();
  96. StringBuilder urlBuilder = new StringBuilder(url);
  97. if (paramMap != null) {
  98. urlBuilder.append("?");
  99. try {
  100. for (Map.Entry<String, String> entry : paramMap.entrySet()) {
  101. urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
  102. append("=").
  103. append(URLEncoder.encode(entry.getValue(), "utf-8")).
  104. append("&");
  105. }
  106. } catch (Exception e) {
  107. e.printStackTrace();
  108. }
  109. urlBuilder.deleteCharAt(urlBuilder.length() - 1);
  110. }
  111. request.url(urlBuilder.toString());
  112. return this;
  113. }
  114. /**
  115. * 初始化post方法
  116. *
  117. * @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
  118. * false等于普通的表单提交
  119. * @return
  120. */
  121. public OkHttpUtils post(boolean isJsonPost) {
  122. RequestBody requestBody;
  123. if (isJsonPost) {
  124. String json = "";
  125. if (paramMap != null) {
  126. json = JSON.toJSONString(paramMap);
  127. }
  128. requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
  129. } else {
  130. FormBody.Builder formBody = new FormBody.Builder();
  131. if (paramMap != null) {
  132. paramMap.forEach(formBody::add);
  133. }
  134. requestBody = formBody.build();
  135. }
  136. request = new Request.Builder().post(requestBody).url(url);
  137. return this;
  138. }
  139. /**
  140. * 同步请求
  141. *
  142. * @return
  143. */
  144. public String sync() {
  145. setHeader(request);
  146. try {
  147. Response response = okHttpClient.newCall(request.build()).execute();
  148. assert response.body() != null;
  149. return response.body().string();
  150. } catch (IOException e) {
  151. e.printStackTrace();
  152. return "请求失败:" + e.getMessage();
  153. }
  154. }
  155. /**
  156. * 异步请求,有返回值
  157. */
  158. public String async() {
  159. StringBuilder buffer = new StringBuilder("");
  160. setHeader(request);
  161. okHttpClient.newCall(request.build()).enqueue(new Callback() {
  162. @Override
  163. public void onFailure(Call call, IOException e) {
  164. buffer.append("请求出错:").append(e.getMessage());
  165. }
  166. @Override
  167. public void onResponse(Call call, Response response) throws IOException {
  168. assert response.body() != null;
  169. buffer.append(response.body().string());
  170. getSemaphoreInstance().release();
  171. }
  172. });
  173. try {
  174. getSemaphoreInstance().acquire();
  175. } catch (InterruptedException e) {
  176. e.printStackTrace();
  177. }
  178. return buffer.toString();
  179. }
  180. /**
  181. * 异步请求,带有接口回调
  182. *
  183. * @param callBack
  184. */
  185. public void async(ICallBack callBack) {
  186. setHeader(request);
  187. okHttpClient.newCall(request.build()).enqueue(new Callback() {
  188. @Override
  189. public void onFailure(Call call, IOException e) {
  190. callBack.onFailure(call, e.getMessage());
  191. }
  192. @Override
  193. public void onResponse(Call call, Response response) throws IOException {
  194. assert response.body() != null;
  195. callBack.onSuccessful(call, response.body().string());
  196. }
  197. });
  198. }
  199. /**
  200. * 为request添加请求头
  201. *
  202. * @param request
  203. */
  204. private void setHeader(Request.Builder request) {
  205. if (headerMap != null) {
  206. try {
  207. for (Map.Entry<String, String> entry : headerMap.entrySet()) {
  208. request.addHeader(entry.getKey(), entry.getValue());
  209. }
  210. } catch (Exception e) {
  211. e.printStackTrace();
  212. }
  213. }
  214. }
  215. /**
  216. * 生成安全套接字工厂,用于https请求的证书跳过
  217. *
  218. * @return
  219. */
  220. private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
  221. SSLSocketFactory ssfFactory = null;
  222. try {
  223. SSLContext sc = SSLContext.getInstance("SSL");
  224. sc.init(null, trustAllCerts, new SecureRandom());
  225. ssfFactory = sc.getSocketFactory();
  226. } catch (Exception e) {
  227. e.printStackTrace();
  228. }
  229. return ssfFactory;
  230. }
  231. private static TrustManager[] buildTrustManagers() {
  232. return new TrustManager[]{
  233. new X509TrustManager() {
  234. @Override
  235. public void checkClientTrusted(X509Certificate[] chain, String authType) {
  236. }
  237. @Override
  238. public void checkServerTrusted(X509Certificate[] chain, String authType) {
  239. }
  240. @Override
  241. public X509Certificate[] getAcceptedIssuers() {
  242. return new X509Certificate[]{};
  243. }
  244. }
  245. };
  246. }
  247. /**
  248. * 自定义一个接口回调
  249. */
  250. public interface ICallBack {
  251. void onSuccessful(Call call, String data);
  252. void onFailure(Call call, String errorMsg);
  253. }
  254. }

3.测试

  1. @SpringBootTest
  2. class SpringBootOkhttp3ApplicationTests {
  3. @Test
  4. void contextLoads() {
  5. // get请求,方法顺序按照这种方式,切记选择post/get一定要放在倒数第二,同步或者异步倒数第一,才会正确执行
  6. OkHttpUtils.builder().url("请求地址,http/https都可以")
  7. // 有参数的话添加参数,可多个
  8. .addParam("参数名", "参数值")
  9. .addParam("参数名", "参数值")
  10. // 也可以添加多个
  11. .addHeader("Content-Type", "application/json; charset=utf-8")
  12. .get()
  13. // 可选择是同步请求还是异步请求
  14. //.async();
  15. .sync();
  16. System.out.println("----------------------------------");
  17. // post请求,分为两种,一种是普通表单提交,一种是json提交
  18. OkHttpUtils.builder().url("请求地址,http/https都可以")
  19. // 有参数的话添加参数,可多个
  20. .addParam("参数名", "参数值")
  21. .addParam("参数名", "参数值")
  22. // 也可以添加多个
  23. .addHeader("Content-Type", "application/json; charset=utf-8")
  24. // 如果是true的话,会类似于postman中post提交方式的raw,用json的方式提交,不是表单
  25. // 如果是false的话传统的表单提交
  26. .post(true)
  27. .sync();
  28. // 选择异步有两个方法,一个是带回调接口,一个是直接返回结果
  29. OkHttpUtils.builder().url("")
  30. .post(false)
  31. .async();
  32. OkHttpUtils.builder().url("").post(false).async(new OkHttpUtils.ICallBack() {
  33. @Override
  34. public void onSuccessful(Call call, String data) {
  35. // 请求成功后的处理
  36. }
  37. @Override
  38. public void onFailure(Call call, String errorMsg) {
  39. // 请求失败后的处理
  40. }
  41. });
  42. }
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45643?site
推荐阅读
相关标签
  

闽ICP备14008679号