自從用了 OkHttp,別的都完全不想用了!
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)
Java封裝OkHttp3工具類,適用于Java后端開發(fā)者。
怎么說(shuō)呢,代碼輕便,使用起來(lái)很很很靈活,響應(yīng)快,比起HttpClient好用許多。當(dāng)然,這些是我個(gè)人觀點(diǎn),不喜勿噴。
準(zhǔn)備工作
????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
(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ǔ)
原文鏈接: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)附上原文出處鏈接及本聲明。

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


