2018-03-29

okHttpUtils(hongyang)的配置及使用(網(wǎng)絡(luò)框架)

okHttpUtils很方便,可以直接更新UI

對okhttp的封裝類,okhttp見:https://github.com/square/okhttp.

目前對應(yīng)okhttp版本3.3.1.

用法

Android Studio

compile 'com.zhy:okhttputils:2.6.2'

Eclipse

下載最新jar:okhttputils-2_6_2.jar

注:需要同時(shí)導(dǎo)入okhttp和okio的jar,下載見:https://github.com/square/okhttp.

目前對以下需求進(jìn)行了封裝

一般的get請求

一般的post請求

基于Http Post的文件上傳(類似表單)

文件下載/加載圖片

上傳下載的進(jìn)度回調(diào)

支持取消某個請求

支持自定義Callback

支持HEAD、DELETE、PATCH、PUT

支持session的保持

支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行

配置OkhttpClient

默認(rèn)情況下,將直接使用okhttp默認(rèn)的配置生成OkhttpClient,如果你有任何配置,記得在Application中調(diào)用initClient方法進(jìn)行設(shè)置。

publicclassMyApplicationextendsApplication{@OverridepublicvoidonCreate()? ? {super.onCreate();OkHttpClientokHttpClient=newOkHttpClient.Builder()//.addInterceptor(new LoggerInterceptor("TAG")).connectTimeout(10000L,TimeUnit.MILLISECONDS)? ? ? ? ? ? ? ? ? .readTimeout(10000L,TimeUnit.MILLISECONDS)//其他配置.build();OkHttpUtils.initClient(okHttpClient);? ? }}

別忘了在AndroidManifest中設(shè)置。

對于Cookie(包含Session)

對于cookie一樣,直接通過cookiejar方法配置,參考上面的配置過程。

CookieJarImpl cookieJar = new CookieJarImpl(new PersistentCookieStore(getApplicationContext()));

OkHttpClient okHttpClient = new OkHttpClient.Builder()

? ? ? ? ? .cookieJar(cookieJar)

? ? ? ? ? //其他配置

? ? ? ? .build();


OkHttpUtils.initClient(okHttpClient);

目前項(xiàng)目中包含:

PersistentCookieStore //持久化cookie

SerializableHttpCookie //持久化cookie

MemoryCookieStore //cookie信息存在內(nèi)存中

如果遇到問題,歡迎反饋,當(dāng)然也可以自己實(shí)現(xiàn)CookieJar接口,編寫cookie管理相關(guān)代碼。

此外,對于持久化cookie還可以使用https://github.com/franmontiel/PersistentCookieJar.

相當(dāng)于框架中只是提供了幾個實(shí)現(xiàn)類,你可以自行定制或者選擇使用。

對于Log

初始化OkhttpClient時(shí),通過設(shè)置攔截器實(shí)現(xiàn),框架中提供了一個LoggerInterceptor,當(dāng)然你可以自行實(shí)現(xiàn)一個Interceptor 。

OkHttpClient okHttpClient = new OkHttpClient.Builder()

? ? ? .addInterceptor(new LoggerInterceptor("TAG"))

? ? ? ? //其他配置

? ? ? ? .build();

OkHttpUtils.initClient(okHttpClient);

對于Https

依然是通過配置即可,框架中提供了一個類HttpsUtils

設(shè)置可訪問所有的https網(wǎng)站

HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

? ? ? ? .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager)

? ? ? ? //其他配置

? ? ? ? .build();

OkHttpUtils.initClient(okHttpClient);

設(shè)置具體的證書

HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(證書的inputstream, null, null);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

? ? ? ? .sslSocketFactory(sslParams.sSLSocketFactory, sslParams.trustManager))

? ? ? ? //其他配置

? ? ? ? .build();

OkHttpUtils.initClient(okHttpClient);

雙向認(rèn)證

HttpsUtils.getSslSocketFactory(

證書的inputstream,

本地證書的inputstream,

本地證書的密碼)

同樣的,框架中只是提供了幾個實(shí)現(xiàn)類,你可以自行實(shí)現(xiàn)SSLSocketFactory,傳入sslSocketFactory即可。

##其他用法示例

GET請求

Stringurl="http://www.csdn.net/";OkHttpUtils.get()? ? .url(url)? ? .addParams("username","hyman")? ? .addParams("password","123")? ? .build()? ? .execute(newStringCallback()? ? ? ? {@OverridepublicvoidonError(Requestrequest,Exceptione)? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? ? ? ? }@OverridepublicvoidonResponse(Stringresponse)? ? ? ? ? ? {? ? ? ? ? ? }? ? ? ? });

POST請求

OkHttpUtils.post()? ? .url(url)? ? .addParams("username","hyman")? ? .addParams("password","123")? ? .build()? ? .execute(callback);

Post JSON

OkHttpUtils.postString()? ? .url(url)? ? .content(newGson().toJson(newUser("zhy","123")))? ? .mediaType(MediaType.parse("application/json; charset=utf-8"))? ? .build()? ? .execute(newMyStringCallback());

提交一個Gson字符串到服務(wù)器端,注意:傳遞JSON的時(shí)候,不要通過addHeader去設(shè)置contentType,而使用.mediaType(MediaType.parse("application/json; charset=utf-8")).。

Post File

OkHttpUtils.postFile().url(url).file(file).build().execute(newMyStringCallback());

將文件作為請求體,發(fā)送到服務(wù)器。

Post表單形式上傳文件

OkHttpUtils.post()//.addFile("mFile","messenger_01.png", file)//.addFile("mFile","test1.txt", file2)//.url(url)? ? .params(params)//.headers(headers)//.build()//.execute(newMyStringCallback());

支持單個多個文件,addFile的第一個參數(shù)為文件的key,即類別表單中的name屬性。

自定義CallBack

目前內(nèi)部包含StringCallBack,FileCallBack,BitmapCallback,可以根據(jù)自己的需求去自定義Callback,例如希望回調(diào)User對象:

publicabstractclassUserCallbackextendsCallback{@OverridepublicUserparseNetworkResponse(Responseresponse)throwsIOException{Stringstring=response.body().string();Useruser=newGson().fromJson(string,User.class);returnuser;? ? }}OkHttpUtils.get()//.url(url)//.addParams("username","hyman")//.addParams("password","123")//.build()//.execute(newUserCallback()? ? {@OverridepublicvoidonError(Requestrequest,Exceptione)? ? ? ? {? ? ? ? ? ? mTv.setText("onError:"+e.getMessage());? ? ? ? }@OverridepublicvoidonResponse(Userresponse)? ? ? ? {? ? ? ? ? ? mTv.setText("onResponse:"+response.username);? ? ? ? }? ? });

通過parseNetworkResponse回調(diào)的response進(jìn)行解析,該方法運(yùn)行在子線程,所以可以進(jìn)行任何耗時(shí)操作,詳細(xì)參見sample。

下載文件

OkHttpUtils//.get()//.url(url)//.build()//.execute(newFileCallBack(Environment.getExternalStorageDirectory().getAbsolutePath(),"gson-2.2.1.jar")//{@OverridepublicvoidinProgress(floatprogress)? ? {? ? ? ? mProgressBar.setProgress((int) (100*progress));? ? }@OverridepublicvoidonError(Requestrequest,Exceptione)? ? {Log.e(TAG,"onError :"+e.getMessage());? ? }@OverridepublicvoidonResponse(Filefile)? ? {Log.e(TAG,"onResponse :"+file.getAbsolutePath());? ? }});

注意下載文件可以使用FileCallback,需要傳入文件需要保存的文件夾以及文件名。

顯示圖片

OkHttpUtils.get()//.url(url)//.build()//.execute(newBitmapCallback()? ? {@OverridepublicvoidonError(Requestrequest,Exceptione)? ? ? ? {? ? ? ? ? ? mTv.setText("onError:"+e.getMessage());? ? ? ? }@OverridepublicvoidonResponse(Bitmapbitmap)? ? ? ? {? ? ? ? ? ? mImageView.setImageBitmap(bitmap);? ? ? ? }? ? });

顯示圖片,回調(diào)傳入BitmapCallback即可。

上傳下載的進(jìn)度顯示

newCallback(){//...@OverridepublicvoidinProgress(floatprogress)? ? {//use progress: 0 ~ 1}}

callback回調(diào)中有inProgress方法,直接復(fù)寫即可。

HEAD、DELETE、PUT、PATCH

OkHttpUtils.put()//also can use delete() ,head() , patch().requestBody(RequestBody.create(null,"may be something"))//.build()//.execute(newMyStringCallback());

如果需要requestBody,例如:PUT、PATCH,自行構(gòu)造進(jìn)行傳入。

同步的請求

Response response = OkHttpUtils

? ? .get()//

? ? .url(url)//

? ? .tag(this)//

? ? .build()//

? ? .execute();

execute方法不傳入callback即為同步的請求,返回Response。

取消單個請求

RequestCallcall=OkHttpUtils.get().url(url).build(); call.cancel();

根據(jù)tag取消請求

目前對于支持的方法都添加了最后一個參數(shù)Object tag,取消則通過OkHttpUtils.cancelTag(tag)執(zhí)行。

例如:在Activity中,當(dāng)Activity銷毀取消請求:

OkHttpUtils

? ? .get()//

? ? .url(url)//

? ? .tag(this)//

? ? .build()//

@Override

protected void onDestroy()

{

? ? super.onDestroy();

? ? //可以取消同一個tag的

? ? OkHttpUtils.cancelTag(this);//取消以Activity.this作為tag的請求

}

比如,當(dāng)前Activity頁面所有的請求以Activity對象作為tag,可以在onDestory里面統(tǒng)一取消。

混淆

#okhttputils

-dontwarn com.zhy.http.**

-keep class com.zhy.http.**{*;}

#okhttp

-dontwarn okhttp3.**

-keep class okhttp3.**{*;}

#okio

-dontwarn okio.**

-keep class okio.**{*;}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容