您的位置:首页 > 理论基础 > 计算机网络

Retrofit与RxJava相结合的网络请求封装

2016-08-23 10:32 323 查看
公司里项目已经换成了RetrofitClient与RxJava相结合的网络请求封装了,前一段时间一直忙着开发任务,现在终于有时间了解一下网络请求封装这一块了。

先创建一个Demo工程,目录我就不展示了。

在src目录下的build.gradle文件中注入依赖,需要添加的依赖如下

compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'


添加好依赖以后,我按照Retrofit的开发文档一步一步完成封装

首先我们创建一个类,完成一些初始化的工作

public class RetrofitClient {

/**
* 所有post请求form的KEY
*/
public static final String POST_FIELD_NAME = "Json";

private Retrofit retrofit;

public RetrofitClient() {
retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(URLHelper.getInstance().URL)
.client(getHttpClient())
.build();
}

/**
* 自定义OkHttpClient 设置超时和LOG
*
* @return
*/
private OkHttpClient getHttpClient() {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
return new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.addInterceptor(logging)
.retryOnConnectionFailure(true)
.build();
}

public MyService getService(){
return retrofit.create(MyService.class);
}
 }


然后设置baseUrl,创建一个URLHelper的类来统一管理URL

public String URL = "http://192.168.0.101:80/api/";
public static URLHelper getInstance(){
return Singleton.instance;
}


创建一个类完成Observable事件的处理,其中RxHttpHelper、HttpErrorInfo和RequestErrorThrowable的代码就不贴出来了,这三个类都是在处理接口返回错误时对应的文字信息

public class InternetAPI {

MyService myService;

public InternetAPI(){
myService = new RetrofitClient().getService();
}

public Observable<GetCorpRegCodeResponse> getCorpRegCode(GetCorpRegCodeRequest request){
return myService.getCorpRegCode(request)
.onErrorResumeNext(new Func1<Throwable, Observable<? extends GetCorpRegCodeResponse>>() {
@Override
public Observable<? extends GetCorpRegCodeResponse> call(Throwable throwable) {
return Observable.error(RxHttpHelper.convertIOEError(throwable));
}
})
.flatMap(new Func1<GetCorpRegCodeResponse, Observable<GetCorpRegCodeResponse>>() {
@Override
public Observable<GetCorpRegCodeResponse> call(GetCorpRegCodeResponse getCorpRegCodeResponse) {
if (getCorpRegCodeResponse == null) {
return Observable.error(new RequestErrorThrowable(HttpErrorInfo.CODE_OF_PARSE_REQUEST_FAILURE,
HttpErrorInfo.MSG_OF_PARSE_REQUEST_FAILURE));
}
if ("0".equals(getCorpRegCodeResponse.result)) {
return Observable.just(getCorpRegCodeResponse);
} else {
if (getCorpRegCodeResponse.errorCode == null) {
return Observable.error(new RequestErrorThrowable(-1, getCorpRegCodeResponse.errorMsg));
}
return Observable.error(new RequestErrorThrowable(Integer.parseInt(getCorpRegCodeResponse.errorCode), getCorpRegCodeResponse.errorMsg));
}
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}

}

MyService来统一管理@POST请求的URL和网络请求的调用

实际调用接口时的URL = baseUrl + @POST   

<span style="font-size:18px;">public interface MyService {

String API_ACCOUNT_GETCORPREGCODE = "account_1_4/GenCorpRegCode/api/";

@Multipart
@POST(API_ACCOUNT_GETCORPREGCODE)
Observable<GetCorpRegCodeResponse> getCorpRegCode(@Part(RetrofitClient.POST_FIELD_NAME)GetCorpRegCodeRequest request);

}</span>


以上就是关于Retrofit与RxJava相结合的网络请求封装的内容,下面我们来看一下实际调用是的代码以及结果

GetCorpRegCodeRequest request = new GetCorpRegCodeRequest();
request.mobelPhone = "15663195534";
request.tmcId = "1222";
InternetHelper.getCorpRegCode(request).subscribe(new Action1<GetCorpRegCodeResponse>() {
@Override
public void call(GetCorpRegCodeResponse getCorpRegCodeResponse) {
//调用成功
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
//调用失败
}
});

请求的URL:http://192.168.0.101/api/account_1_4/GenCorpRegCode/api/
请求的JSON:{"Mobilephone":"15663195534","SourceID":"1222","ServerFrom":"","appId":1}

返回的数据:{

    "processTime": "2016-08-23 01:48:21",

    "process_status": "-1",

    "errorMessage": "申请失败,请联系管理员!",

    "errorCode": null

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息