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工具類

        共 26435字,需瀏覽 53分鐘

         ·

        2021-06-08 10:12


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

        說實(shí)在話,用過挺多網(wǎng)絡(luò)請(qǐng)求工具,有過java原生的,HttpClient3和4,但是個(gè)人感覺用了OkHttp3之后,之前的那些完全不想再用了。怎么說呢,代碼輕便,使用起來很很很靈活,響應(yīng)快,比起HttpClient好用許多。當(dāng)然,這些是我個(gè)人觀點(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傳輸,也少不了要這個(gè)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");
                        }
                    }
                }
            }

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

            private static Semaphore getSemaphoreInstance() {
                //只能1個(gè)線程同時(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;
            }

            /**
             * 添加請(qǐng)求頭
             *
             * @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;
            }

            /**
             * 同步請(qǐng)求
             *
             * @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 "請(qǐng)求失?。? + e.getMessage();
                }
            }

            /**
             * 異步請(qǐng)求,有返回值
             */

            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("請(qǐng)求出錯(cuò):").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();
            }

            /**
             * 異步請(qǐng)求,帶有接口回調(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添加請(qǐng)求頭
             *
             * @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請(qǐng)求的證書跳過
             *
             * @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[]{};
                            }
                        }
                };
            }

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

            public interface ICallBack {

                void onSuccessful(Call call, String data);

                void onFailure(Call call, String errorMsg);

            }
        }

        使用教程

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

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

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

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

        結(jié)語

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

        作者:如漩渦

        https://urlify.cn/Iz2myy


        END


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

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

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

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



        瀏覽 39
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(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>
            色中文| free国产性白嫩白嫩xxxx | 国产免费拔擦拔擦8x在线下载 | 国产69精品久久久久久久久久 | 好爽…又高潮了免费毛片 | 女生扒开腿让男人捅 | 日韩精品A片一区二区三区妖精 | 插逼逼视频免费 | 爆操小穴视频 | 国产在线综合第一站 |