<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java封裝OkHttp3工具類

          共 26435字,需瀏覽 53分鐘

           ·

          2021-06-08 10:12


          Java封裝OkHttp3工具類,適用于Java后端開發(fā)者

          說實在話,用過挺多網(wǎng)絡(luò)請求工具,有過java原生的,HttpClient3和4,但是個人感覺用了OkHttp3之后,之前的那些完全不想再用了。怎么說呢,代碼輕便,使用起來很很很靈活,響應(yīng)快,比起HttpClient好用許多。當(dāng)然,這些是我個人觀點,不喜勿噴。

          準備工作

          Maven項目在pom文件中引入jar包

          <dependency>
              <groupId>com.squareup.okhttp3</groupId>
              <artifactId>okhttp</artifactId>
              <version>3.10.0</version>
          </dependency>
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>fastjson</artifactId>
              <version>1.2.60</version>
          </dependency>

          引入json是因為工具類中有些地方用到了,現(xiàn)在通信都流行使用json傳輸,也少不了要這個jar包

          工具類代碼

          import com.alibaba.fastjson.JSON;
          import okhttp3.*;

          import javax.net.ssl.SSLContext;
          import javax.net.ssl.SSLSocketFactory;
          import javax.net.ssl.TrustManager;
          import javax.net.ssl.X509TrustManager;
          import java.io.IOException;
          import java.net.URLEncoder;
          import java.security.SecureRandom;
          import java.security.cert.X509Certificate;
          import java.util.LinkedHashMap;
          import java.util.Map;
          import java.util.concurrent.Semaphore;
          import java.util.concurrent.TimeUnit;

          public class OkHttpUtils {
              private static volatile OkHttpClient okHttpClient = null;
              private static volatile Semaphore semaphore = null;
              private Map<String, String> headerMap;
              private Map<String, String> paramMap;
              private String url;
              private Request.Builder request;

              /**
               * 初始化okHttpClient,并且允許https訪問
               */

              private OkHttpUtils() {
                  if (okHttpClient == null) {
                      synchronized (OkHttpUtils.class{
                          if (okHttpClient == null) {
                              TrustManager[] trustManagers = buildTrustManagers();
                              okHttpClient = new OkHttpClient.Builder()
                                      .connectTimeout(15, TimeUnit.SECONDS)
                                      .writeTimeout(20, TimeUnit.SECONDS)
                                      .readTimeout(20, TimeUnit.SECONDS)
                                      .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
                                      .hostnameVerifier((hostName, session) -> true)
                                      .retryOnConnectionFailure(true)
                                      .build();
                              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");
                          }
                      }
                  }
              }

              /**
               * 用于異步請求時,控制訪問線程數(shù),返回結(jié)果
               *
               * @return
               */

              private static Semaphore getSemaphoreInstance() {
                  //只能1個線程同時訪問
                  synchronized (OkHttpUtils.class{
                      if (semaphore == null) {
                          semaphore = new Semaphore(0);
                      }
                  }
                  return semaphore;
              }

              /**
               * 創(chuàng)建OkHttpUtils
               *
               * @return
               */

              public static OkHttpUtils builder() {
                  return new OkHttpUtils();
              }

              /**
               * 添加url
               *
               * @param url
               * @return
               */

              public OkHttpUtils url(String url) {
                  this.url = url;
                  return this;
              }

              /**
               * 添加參數(shù)
               * 
               * @param key   參數(shù)名
               * @param value 參數(shù)值
               * @return
               */

              public OkHttpUtils addParam(String key, String value) {
                  if (paramMap == null) {
                      paramMap = new LinkedHashMap<>(16);
                  }
                  paramMap.put(key, value);
                  return this;
              }

              /**
               * 添加請求頭
               *
               * @param key   參數(shù)名
               * @param value 參數(shù)值
               * @return
               */

              public OkHttpUtils addHeader(String key, String value) {
                  if (headerMap == null) {
                      headerMap = new LinkedHashMap<>(16);
                  }
                  headerMap.put(key, value);
                  return this;
              }

              /**
               * 初始化get方法
               *
               * @return
               */

              public OkHttpUtils get() {
                  request = new Request.Builder().get();
                  StringBuilder urlBuilder = new StringBuilder(url);
                  if (paramMap != null) {
                      urlBuilder.append("?");
                      try {
                          for (Map.Entry<String, String> entry : paramMap.entrySet()) {
                              urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
                                      append("=").
                                      append(URLEncoder.encode(entry.getValue(), "utf-8")).
                                      append("&");
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                      urlBuilder.deleteCharAt(urlBuilder.length() - 1);
                  }
                  request.url(urlBuilder.toString());
                  return this;
              }

              /**
               * 初始化post方法
               *
               * @param isJsonPost true等于json的方式提交數(shù)據(jù),類似postman里post方法的raw
               *                   false等于普通的表單提交
               * @return
               */

              public OkHttpUtils post(boolean isJsonPost) {
                  RequestBody requestBody;
                  if (isJsonPost) {
                      String json = "";
                      if (paramMap != null) {
                          json = JSON.toJSONString(paramMap);
                      } 
                      requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
                  } else {
                      FormBody.Builder formBody = new FormBody.Builder();
                      if (paramMap != null) {
                          paramMap.forEach(formBody::add);
                      }
                      requestBody = formBody.build();
                  }
                  request = new Request.Builder().post(requestBody).url(url);
                  return this;
              }

              /**
               * 同步請求
               *
               * @return
               */

              public String sync() {
                  setHeader(request);
                  try {
                      Response response = okHttpClient.newCall(request.build()).execute();
                      assert response.body() != null;
                      return response.body().string();
                  } catch (IOException e) {
                      e.printStackTrace();
                      return "請求失敗:" + e.getMessage();
                  }
              }

              /**
               * 異步請求,有返回值
               */

              public String async() {
                  StringBuilder buffer = new StringBuilder("");
                  setHeader(request);
                  okHttpClient.newCall(request.build()).enqueue(new Callback() {
                      @Override
                      public void onFailure(Call call, IOException e) {
                          buffer.append("請求出錯:").append(e.getMessage());
                      }

                      @Override
                      public void onResponse(Call call, Response response) throws IOException {
                          assert response.body() != null;
                          buffer.append(response.body().string());
                          getSemaphoreInstance().release();
                      }
                  });
                  try {
                      getSemaphoreInstance().acquire();
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
                  return buffer.toString();
              }

              /**
               * 異步請求,帶有接口回調(diào)
               *
               * @param callBack
               */

              public void async(ICallBack callBack) {
                  setHeader(request);
                  okHttpClient.newCall(request.build()).enqueue(new Callback() {
                      @Override
                      public void onFailure(Call call, IOException e) {
                          callBack.onFailure(call, e.getMessage());
                      }

                      @Override
                      public void onResponse(Call call, Response response) throws IOException {
                          assert response.body() != null;
                          callBack.onSuccessful(call, response.body().string());
                      }
                  });
              }

              /**
               * 為request添加請求頭
               *
               * @param request
               */

              private void setHeader(Request.Builder request) {
                  if (headerMap != null) {
                      try {
                          for (Map.Entry<String, String> entry : headerMap.entrySet()) {
                              request.addHeader(entry.getKey(), entry.getValue());
                          }
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                  }
              }


              /**
               * 生成安全套接字工廠,用于https請求的證書跳過
               *
               * @return
               */

              private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
                  SSLSocketFactory ssfFactory = null;
                  try {
                      SSLContext sc = SSLContext.getInstance("SSL");
                      sc.init(null, trustAllCerts, new SecureRandom());
                      ssfFactory = sc.getSocketFactory();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return ssfFactory;
              }

              private static TrustManager[] buildTrustManagers() {
                  return new TrustManager[]{
                          new X509TrustManager() {
                              @Override
                              public void checkClientTrusted(X509Certificate[] chain, String authType) {
                              }

                              @Override
                              public void checkServerTrusted(X509Certificate[] chain, String authType) {
                              }

                              @Override
                              public X509Certificate[] getAcceptedIssuers() {
                                  return new X509Certificate[]{};
                              }
                          }
                  };
              }

              /**
               * 自定義一個接口回調(diào)
               */

              public interface ICallBack {

                  void onSuccessful(Call call, String data);

                  void onFailure(Call call, String errorMsg);

              }
          }

          使用教程

          public static void main(String[] args) {
              // get請求,方法順序按照這種方式,切記選擇post/get一定要放在倒數(shù)第二,同步或者異步倒數(shù)第一,才會正確執(zhí)行
              OkHttpUtils.builder().url("請求地址,http/https都可以")
                      // 有參數(shù)的話添加參數(shù),可多個
                      .addParam("參數(shù)名""參數(shù)值")
                      .addParam("參數(shù)名""參數(shù)值")
                      // 也可以添加多個
                      .addHeader("Content-Type""application/json; charset=utf-8")
                      .get()
                      // 可選擇是同步請求還是異步請求
                      //.async();
                      .sync();

              // post請求,分為兩種,一種是普通表單提交,一種是json提交
              OkHttpUtils.builder().url("請求地址,http/https都可以")
                      // 有參數(shù)的話添加參數(shù),可多個
                      .addParam("參數(shù)名""參數(shù)值")
                      .addParam("參數(shù)名""參數(shù)值")
                      // 也可以添加多個
                      .addHeader("Content-Type""application/json; charset=utf-8")
                      // 如果是true的話,會類似于postman中post提交方式的raw,用json的方式提交,不是表單
                      // 如果是false的話傳統(tǒng)的表單提交
                      .post(true)
                      .sync();
              
              // 選擇異步有兩個方法,一個是帶回調(diào)接口,一個是直接返回結(jié)果
              OkHttpUtils.builder().url("")
                      .post(false)
                      .async();

              OkHttpUtils.builder().url("").post(false).async(new OkHttpUtils.ICallBack() {
                  @Override
                  public void onSuccessful(Call call, String data) {
                      // 請求成功后的處理
                  }

                  @Override
                  public void onFailure(Call call, String errorMsg) {
                      // 請求失敗后的處理
                  }
              });
          }

          結(jié)語

          封裝的明明白白,使用的簡簡單單,簡單的幾下就能做請求,用建造者模式是真的舒服 

          作者:如漩渦

          https://urlify.cn/Iz2myy


          END


          順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術(shù)PDF,絕大部分核心的技術(shù)書籍都可以在這里找到,

          GitHub地址:https://github.com/javadevbooks/books

          Gitee地址:https://gitee.com/javadevbooks/books

          電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..



          瀏覽 39
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  奇米视频7777 | 学生妹一级 | 亚洲AV秘 无码 18日韩 | 日本一区二区三区视频免费看 | 黄色毛片一级 |