第一步 Android studio 項(xiàng)目配置
在build.gradle 中添加以下配置
compile ‘io.reactivex.rxjava2:rxjava:2.1.1’
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
compile ‘com.squareup.retrofit2:retrofit:2.3.0’
compile ‘com.squareup.retrofit2:converter-gson:2.3.0’
complie ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’
complie ‘com.squareup.okhttp3:logging-intereceptor:3.8.0’
注意事項(xiàng) retrofit2.3.0 是基于OKHttp3.8.0 添加
com.squareuo.okhttp3:logging-intereceptor:3.8.0
注意版本要一致册养,否則運(yùn)行時(shí)會(huì)失敗
第二步 retrofit 注解
注解 retrofit通過(guò)使用注解來(lái)簡(jiǎn)化請(qǐng)求,大體分為以下幾類:
retrofit通過(guò)使用注解來(lái)簡(jiǎn)化請(qǐng)求算行,大體分為以下幾類
1.用于標(biāo)注請(qǐng)求方式的注解
2.用于標(biāo)記請(qǐng)求頭的注解
3.用于標(biāo)記請(qǐng)求參數(shù)的注解
4.用于標(biāo)記請(qǐng)求和響應(yīng)格式的注解
請(qǐng)求方法注解
注解 說(shuō)明
GET get請(qǐng)求
POST post請(qǐng)求
PUT put請(qǐng)求
DELETE delete請(qǐng)求
PATCH patch請(qǐng)求企量,該請(qǐng)求是對(duì)put請(qǐng)求的補(bǔ)充甘畅,用于更新局部資源
HEAD head請(qǐng)求
OPTIONS option請(qǐng)求
HTTP 通用注解,可以替換以上所有的注解慨蓝,其擁有三個(gè)屬性:method剧防,path京革,hasBody
請(qǐng)求頭注解
注解 說(shuō)明
Headers 用于添加固定請(qǐng)求頭奇唤,可以同時(shí)添加多個(gè)。通過(guò)該注解添加的請(qǐng)求頭不會(huì)相互覆蓋匹摇,而是共同存在
Header 作為方法的參數(shù)傳入咬扇,用于添加不固定值的Header,該注解會(huì)更新已有的請(qǐng)求頭
請(qǐng)求參數(shù)注解
名稱 說(shuō)明
Body 多用于post請(qǐng)求發(fā)送非表單數(shù)據(jù),比如想要以post方式傳遞json格式數(shù)據(jù)
Filed 多用于post請(qǐng)求中表單字段,Filed和FieldMap需要FormUrlEncoded結(jié)合使用
FiledMap 和@Filed作用一致廊勃,用于不確定表單參數(shù)
Part 用于表單字段,Part和PartMap與Multipart注解結(jié)合使用,適合文件上傳的情況
PartMap 用于表單字段,默認(rèn)接受的類型是Map懈贺,可用于實(shí)現(xiàn)多文件上傳
Path 用于url中的占位符
Query 用于Get中指定參數(shù)
QueryMap 和Query使用類似
Url 指定請(qǐng)求路徑
請(qǐng)求和響應(yīng)格式注解
名稱 說(shuō)明
FormUrlEncoded 表示請(qǐng)求發(fā)送編碼表單數(shù)據(jù),每個(gè)鍵值對(duì)需要使用@Field注解
Multipart 表示請(qǐng)求發(fā)送multipart數(shù)據(jù)坡垫,需要配合使用@Part
Streaming 表示響應(yīng)用字節(jié)流的形式返回.如果沒(méi)使用該注解,默認(rèn)會(huì)把數(shù)據(jù)全部載入到內(nèi)存中.該注解在在下載大文件的特別有用
第三步 retrofit 基礎(chǔ)類創(chuàng)建
創(chuàng)建請(qǐng)求
publicinterfaceRetrofitService{
@POST("Account/Login")
Observable> login(@BodyLogin login);
@GET("Order/Query")
Observable>>? ? queryOrder(@Query("page")intpage,@Query("pageSize")intpageSize,
@Query("status")intstatus,@Query("time") String time,
@Query("date") String date,@Query("key") String key,
@Query("token") String token);
}
創(chuàng)建攔截器
* 創(chuàng)建日志攔截器
*
*@return
*/
privatestaticHttpLoggingInterceptorlogInterceptor(){
HttpLoggingInterceptor logInterceptor =newHttpLoggingInterceptor(newHttpLoggingInterceptor.Logger(){
@Verride
publicvoidlog(String message){
Log.e("OKhttp","log= "+ message);
}
});
logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
returnlogInterceptor;
}
創(chuàng)建OKHttpClient
privatestaticOkHttpClient okHttpClient =newOKHttpClient.Builder()
//添加通用的 Header 攔截器替換原有的COOKIE 可根據(jù)需要自行添加不同攔截器
.addInterceptor(newInterceptor(){
@Override
publicResponseintercept(Chain chain)throwsIOException{
//替換原有的COOKIE
Request request = chain.request();
Request.Builder builder = request.newBuilder().removeHeader("COOKIE");
builder.addHeader("COOKIE", cookie)
returnchain.procedd(builder.build());
}
.addInterceptor(logInterceptor())
.connectTimeout(30, TimeUint.SECONDS)
.readTimeout(100, TimeUint.SECONDS)
.build();
})
提供retrofit 方法調(diào)用
RetrofitService retrofitService =newRerofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.cilent(okHttpClient)
.build()
.create(RetrofitService.class);
publicstaticRetrofitServicegetInstance(){
returnretrofitService;
}
接口調(diào)用
Login login =newLogin("name","passWord");
ObserVable> obserVable = RetrofitFactory.getInstance.login(login);
observable.subscribeOn(Schedulers.io())
.filter(userBaseBean -> userBaseBean.isResult())
.map(userBaseBean -> {
Constant.setLogUser(userBeseBean.getData());
returnuserBaseBean.getData();
}).observeOn(AndroidSchedulers.mainThread())
.subscribe(userBean ->{
startActivity(newIntetn(context, MainActivity.class));
})
增加通用ObserVable
publicabstractclassBaseObserverimplementsObserver>{
privatestaticfinalString TAG ="BaseObserver";
privateContext mContext;
publicBaseObserver(Context mContext){
this.mContext = mContext;
}
@Override
publicvoidonSubscribe(@NonNull Disposable d){
}
@Override
publicvoidonNext(@NonNull BaseBean tBaseBean){
if(tBaseBean.isResult()){
onHandleSuccess(tBaseBean.getData());
}else{
onHandleError(tBaseBean.getMessage());
}
}
@Override
publicvoidonError(@NonNull Throwable e){
LogUtil.e(e.toString(), BaseObserver.class);
}
@Override
publicvoidonComplete(){
LogUtil.d("onComplete()", BaseObserver.class);
}
protectedabstractvoidonHandleSuccess(T t);
protectedvoidonHandleError(String msg){
LogUtil.e(msg, getClass());
Looper mainLooper = mContext.getMainLooper();
newHandler(mainLooper).post(() -> {
if(mContextinstanceofParentActivity){
((ParentActivity) mContext).hideLoading();
}elseif(mContextinstanceofParentFragmentActivity)
((ParentFragmentActivity) mContext).hideLoading();
FinalToast.ErrorContext(mContext, msg);
});
}
}