国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java OkHttp3工具類(lèi)

這篇具有很好參考價(jià)值的文章主要介紹了Java OkHttp3工具類(lèi)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

okhttp3現(xiàn)在基本都在用的一個(gè)底層網(wǎng)絡(luò)框架。這篇博客主要的目的就是將OKHttp3這個(gè)框架在開(kāi)發(fā)中能用到的地方都記錄下來(lái),也當(dāng)一個(gè)工具文檔為日后使用時(shí)查找方便。

vOkHttpUtils

import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
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;

/**
 * @Author
 * @Date 2024/3
 * @Des
 */
@Slf4j
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訪問(wèn)
     */
    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í),控制訪問(wèn)線程數(shù),返回結(jié)果
     *
     * @return
     */
    private static Semaphore getSemaphoreInstance() {
        //只能1個(gè)線程同時(shí)訪問(wèn)
        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ù),類(lèi)似postman里post方法的raw
     *                   false等于普通的表單提交
     * @return
     */
    public OkHttpUtils post(boolean isJsonPost) {
        RequestBody requestBody;
        if (isJsonPost) {
            String json = "";
            if (paramMap != null) {
                json = GsonUtils.toJSONString(paramMap);
                // 如果沒(méi)有GsonUtils工具類(lèi)就用下面這行代碼
                // json = new Gson().toJson(value)
            }
            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)求的證書(shū)跳過(guò)
     *
     * @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);

    }
}

v使用示例

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ì)類(lèi)似于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)求失敗后的處理
        }
    });
}

v源碼地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-840917.html

到了這里,關(guān)于Java OkHttp3工具類(lèi)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring boot 使用 Okhttp3

    Spring boot 集成 okhttp3, 使用 http,https 在項(xiàng)目調(diào)用第三方服務(wù)是在所難免的,運(yùn)用傳統(tǒng)類(lèi)型的Http調(diào)用,封裝繁瑣,代碼量多還不簡(jiǎn)潔,避免一次一次的 找 度娘, 小記一下。 引入jar OkRestClient 工具類(lèi) OkHttp動(dòng)態(tài)配置 使用 OkHttp 使用OkHttp 時(shí) 只需要注入?@AutoWired OkRestClient okRestC

    2024年02月11日
    瀏覽(22)
  • Android Okhttp3 分發(fā)器源碼解析

    在 OkHttp 中,分發(fā)器(Dispatcher)是負(fù)責(zé)調(diào)度和執(zhí)行網(wǎng)絡(luò)請(qǐng)求的組件。它 管理 著 并發(fā) 的 請(qǐng)求數(shù)量 以及請(qǐng)求的 優(yōu)先級(jí) ,確保合理地使用底層的連接池和線程池,從而 提高 網(wǎng)絡(luò)請(qǐng)求的 效率 和 性能 。 默認(rèn)情況下,OkHttp 使用一個(gè)單例的分發(fā)器,它可以處理同時(shí)進(jìn)行的最大請(qǐng)求

    2024年02月12日
    瀏覽(21)
  • com.squareup.okhttp3:okhttp 組件安全漏洞及健康度分析

    com.squareup.okhttp3:okhttp 組件安全漏洞及健康度分析

    維護(hù)者 square組織 許可證類(lèi)型 Apache License 2.0 首次發(fā)布 2016 年 1 月 2 日 最新發(fā)布時(shí)間 2023 年 4 月 23 日 GitHub Star 44403 GitHub Fork 9197 依賴(lài)包 5,582 依賴(lài)存儲(chǔ)庫(kù) 77,217 com.squareup.okhttp3:okhttp 一個(gè)開(kāi)源的 HTTP 客戶(hù)端庫(kù),可以用于 Android 和 Java 應(yīng)用程序。它提供了一種簡(jiǎn)單而強(qiáng)大的方式來(lái)發(fā)

    2024年02月10日
    瀏覽(38)
  • Android okhttp3.0配置https信任所有證書(shū)

    參考: Android okhttp3.0配置https的自簽證書(shū)和信任所有證書(shū)

    2024年02月19日
    瀏覽(20)
  • SpringBoot集成websocket(4)|(使用okhttp3實(shí)現(xiàn)websocket)

    章節(jié) 第一章鏈接: SpringBoot集成websocket(1)|(websocket客戶(hù)端實(shí)現(xiàn)) 第二章鏈接: SpringBoot集成websocket(2)|(websocket服務(wù)端實(shí)現(xiàn)以及websocket中轉(zhuǎn)實(shí)現(xiàn)) HTTP是現(xiàn)代應(yīng)用常用的一種交換數(shù)據(jù)和媒體的網(wǎng)絡(luò)方式,高效地使用HTTP能讓資源加載更快,節(jié)省帶寬。OkHttp是一個(gè)高效的HTTP客戶(hù)

    2024年02月10日
    瀏覽(19)
  • Android Okhttp3添加https自簽名證書(shū)以及Glide4

    Android Okhttp3添加https自簽名證書(shū)以及Glide4

    沒(méi)有得到安卓認(rèn)可的證書(shū)頒發(fā)機(jī)構(gòu)頒發(fā)的證書(shū). 自己頒發(fā)的證書(shū), 分臨時(shí)性的(在開(kāi)發(fā)階段使用)或在發(fā)布的產(chǎn)品中永久性使用的兩種. 而只有Android系統(tǒng)認(rèn)可的機(jī)構(gòu)辦法的證書(shū),在使用過(guò)程中才不會(huì)出現(xiàn)安全提示。 為什么會(huì)有人使用自簽名的證書(shū)呢? (重要的事重復(fù)三遍)免費(fèi)

    2024年04月16日
    瀏覽(26)
  • Android Okhttp3添加https自簽名證書(shū)以及Glide4,Android高級(jí)工程師進(jìn)階學(xué)習(xí)—Android熱修復(fù)原理

    Android Okhttp3添加https自簽名證書(shū)以及Glide4,Android高級(jí)工程師進(jìn)階學(xué)習(xí)—Android熱修復(fù)原理

    二、自簽名證書(shū) 什么是自簽名證書(shū)(self-signed certicates)? 自簽名證書(shū)就是沒(méi)有通過(guò)受信任的證書(shū)頒發(fā)機(jī)構(gòu), 自己給自己頒發(fā)的證書(shū). SSL 證書(shū)大致分三類(lèi): 由安卓認(rèn)可的證書(shū)頒發(fā)機(jī)構(gòu)CA(Certificate Authority)(如: VeriSign、DigiCert), 或這些機(jī)構(gòu)的下屬機(jī)構(gòu)頒發(fā)的證書(shū). 沒(méi)有得到安卓認(rèn)可的

    2024年04月17日
    瀏覽(27)
  • Java請(qǐng)求Http接口-OkHttp(超詳細(xì)-附帶工具類(lèi))

    Java請(qǐng)求Http接口-OkHttp(超詳細(xì)-附帶工具類(lèi))

    簡(jiǎn)介:OkHttp是一個(gè)默認(rèn)有效的HTTP客戶(hù)端,有效地執(zhí)行HTTP可以加快您的負(fù)載并節(jié)省帶寬,如果您的服務(wù)有多個(gè)IP地址,如果第一次連接失敗,OkHttp將嘗試備用地址。這對(duì)于IPv4 + IPv6和冗余數(shù)據(jù)中心中托管的服務(wù)是必需的。OkHttp啟動(dòng)具有現(xiàn)代TLS功能(SNI,ALPN)的新連接,并在握手

    2024年02月12日
    瀏覽(32)
  • java通過(guò)okhttp方式實(shí)現(xiàn)https請(qǐng)求的工具類(lèi)(繞過(guò)證書(shū)驗(yàn)證)

    java通過(guò)okhttp方式實(shí)現(xiàn)https請(qǐng)求的工具類(lèi)(繞過(guò)證書(shū)驗(yàn)證)

    引入相關(guān)依賴(lài)包 2.1、跳過(guò)證書(shū)配置類(lèi) 跳過(guò)證書(shū)配置類(lèi)代碼 2.2、okhttp方式的 https工具類(lèi) okhttp方式的 https工具類(lèi)代碼 測(cè)試代碼 測(cè)試輸出結(jié)果

    2024年01月23日
    瀏覽(64)
  • okhttp下載文件 Java下載文件 javaokhttp下載文件 下載文件 java下載 okhttp下載 okhttp

    示例 http客戶(hù)端 用的是 okhttp,也可以用 UrlConnetcion或者apache okhttp官網(wǎng) 也可以下載 okhttp jar方式引入 1.1、okhttp發(fā)起請(qǐng)求官網(wǎng)Demo 3.1讀寫(xiě)內(nèi)容

    2024年02月12日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包