<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>

          自從用了 OkHttp,別的都完全不想用了!

          共 10194字,需瀏覽 21分鐘

           ·

          2022-01-23 14:53

          點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)

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

          說(shuō)實(shí)在話,用過(guò)挺多網(wǎng)絡(luò)請(qǐng)求工具,有過(guò)java原生的,HttpClient3和4,但是個(gè)人感覺用了OkHttp3之后,之前的那些完全不想再用了。

          怎么說(shuō)呢,代碼輕便,使用起來(lái)很很很靈活,響應(yīng)快,比起HttpClient好用許多。當(dāng)然,這些是我個(gè)人觀點(diǎn),不喜勿噴。

          準(zhǔn)備工作

          Maven項(xiàng)目在pom文件中引入jar包


          ????com.squareup.okhttp3
          ????okhttp
          ????3.10.0


          ????com.alibaba
          ????fastjson
          ????1.2.60

          引入json是因?yàn)楣ぞ哳愔杏行┑胤接玫搅耍F(xiàn)在通信都流行使用json傳輸,也少不了要這個(gè)jar包。(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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">工具類代碼

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">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?headerMap;
          ????private?Map?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?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?entry?:?headerMap.entrySet())?{
          ????????????????????request.addHeader(entry.getKey(),?entry.getValue());
          ????????????????}
          ????????????}?catch?(Exception?e)?{
          ????????????????e.printStackTrace();
          ????????????}
          ????????}
          ????}


          ????/**
          ?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);

          ????}
          }

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">使用教程

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">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)求失敗后的處理
          ????????}
          ????});
          }

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" data-linktype="2">結(jié)語(yǔ)

          (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?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?entry?:?headerMap.entrySet())?{????????????????????request.addHeader(entry.getKey(),?entry.getValue());????????????????}????????????}?catch?(Exception?e)?{????????????????e.printStackTrace();????????????}????????}????}????/**?????*?生成安全套接字工廠,用于https請(qǐng)求的證書跳過(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);????}}使用教程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é)語(yǔ)封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。" data-itemshowtype="0" tab="innerlink" style="color: rgb(58, 58, 58);" data-linktype="2">封裝的明明白白,使用的簡(jiǎn)簡(jiǎn)單單,簡(jiǎn)單的幾下就能做請(qǐng)求,用建造者模式是真的舒服。

          原文鏈接:https://blog.csdn.net/m0_37701381/article/details/103386345

          版權(quán)聲明:本文為CSDN博主「如漩渦」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。








          微信官宣:一大波新年紅包封面來(lái)了!
          2021 年發(fā)生的 10 件技術(shù)大事!!
          23 種設(shè)計(jì)模式實(shí)戰(zhàn)(很全)
          Log4j2 漏洞之 JNDI 到底是個(gè)什么鬼?
          炸了!Log4j2 再爆漏洞。。
          勁爆!Java 協(xié)程要來(lái)了
          重磅官宣:Redis 對(duì)象映射框架來(lái)了!!
          推薦一款代碼神器,代碼量至少省一半!
          程序員精通各種技術(shù)體系,45歲求職難!
          重磅!Spring Boot 2.6 正式發(fā)布
          Spring Boot 學(xué)習(xí)筆記,這個(gè)太全了!



          關(guān)注Java技術(shù)棧看更多干貨



          獲取 Spring Boot 實(shí)戰(zhàn)筆記!
          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  靠逼国产| 久久短视频| 一区二区3区免费 | 青青草在线无码视频 | 五十路老熟女 码视频 |