RxJava+Retrofit 网络请求时使用自定义拦截器Int
2018-12-01 本文已影响128人
谁把我的昵称都占用了
在项目开发中,使用RxJava+Retrofit 网络请求一般会遇到多个baseUrl,如果仅仅通过Retrofit 的方法设置一个baseUrl是达不到效果的。
new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(FormConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(HJson.getGson()))
.client(UOkHttp.getInstance().okHttpClient)
.build();
此时需要自定义一个拦截器,处理不同的baseUrl,继承okhttp3(Retrofit底层使用的还是okhttp)中提供的Interceptor接口,实现intercept方法,在其中获取Request和headers,判断其中的数据并处理。
public class HhmOkInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//获取request
Request request = chain.request();
//获取request的创建者builder
Request.Builder builder = request.newBuilder();
//从request中获取headers,通过给定的键url_name
List<String> headerValues = request.headers("base_url");
if (headerValues != null && headerValues.size() > 0) {
//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader("base_url");
//匹配获得新的BaseUrl
String headerValue = headerValues.get(0);
HttpUrl newBaseUrl;
if ("one".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(API.BASE_URL_ONE);
} else if ("two".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(API.BASE_URL_TWO);
} else if("three".equals(headerValue)){
newBaseUrl = HttpUrl.parse(API.BASE_URL_THREE);
} else if("test".equals(headerValue)){
newBaseUrl = HttpUrl.parse(API.BASE_URL_TEST);
}
else{
//还是原来的地址
newBaseUrl = HttpUrl.parse(API.BASE_URL);
}
//从request中获取原有的HttpUrl实例oldHttpUrl
HttpUrl oldHttpUrl = request.url();
//重建新的HttpUrl,修改需要修改的url部分
HttpUrl newFullUrl = oldHttpUrl
.newBuilder()
.scheme(newBaseUrl.scheme())
.host(newBaseUrl.host())
.port(newBaseUrl.port())
.build();
//重建这个request,通过builder.url(newFullUrl).build();
//然后返回一个response至此结束修改
return chain.proceed(builder.url(newFullUrl).build());
} else {
return chain.proceed(request);
}
}
}
在OkHttp对象中添加该拦截器对象。
new OkHttpClient.Builder()
.addInterceptor(new HhmOkInterceptor())//添加上面的url拦截器
.build();
在Retrofit请求接口中添加注解,如果不添加Headers注解的默认使用baseUrl,添加该注解的则使用注解对应的baseUrl。比如下面第一个请求注解对应的baseUrl为API.BASE_URL_ONE,第二个请求对应的baseUrl为API.BASE_URL。
@Headers({"base_url:one"})//添加注解,更换baseUrl
@POST(ApiMethods.getData)
Observable<BaseResponse> getData(@Body BaseParams params);
@POST(ApiMethods.userLogin)
Observable<LoginResponse> getUserLogin(@Body LoginParams params);