1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java封裝OkHttp3工具類

        共 26470字,需瀏覽 53分鐘

         ·

        2021-07-04 15:20

        程序員的成長之路
        互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
        關(guān)注


        閱讀本文大概需要 5.5 分鐘。

        來自:https://blog.csdn.net/m0_37701381

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

        準(zhǔn)備工作

        Maven項(xiàng)目在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是因?yàn)楣ぞ哳愔杏行┑胤接玫搅?,現(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í),控制訪問線程數(shù),返回結(jié)果
             *
             * @return
             */

            private static Semaphore getSemaphoreInstance() {
                //只能1個線程同時(shí)訪問
                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é)語

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

        推薦閱讀:

        全網(wǎng)瘋傳:程序員的酒后真言

        當(dāng)Java枚舉遇到位掩碼,還能這么玩?

        最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

        獲取方式:點(diǎn)個「在看」,點(diǎn)擊上方小卡片,進(jìn)入公眾號后回復(fù)「面試題」領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

        朕已閱 

        瀏覽 54
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产黄色视频在线观看 | 风流少妇视频 | 色婷婷一区 | 高h视频欧美 | 国产一级婬片A片AAAA级 2 0 | 黄片直接看 | 超碰人人草人人干 | 国产69成人精品视频免费APP | 色戒未删减免费在线观看完整版 | 97国产在线 |