在项目中偶尔会碰到多base_url的情况,其实这个做法很讨厌,但是后端又没办法才这样做的,当使用retrofit作为网络框架的时候,出现多base_url的情况又很麻烦,下面提供我解决的方案
在ApiService处
public static String URL_1="url_name:url_1";
public static String URL_2="url_name:url_2";
/**
* 登陆
*
* @param map
* @return
*/
@Headers({URL_1})
@FormUrlEncoded
@POST("/Account/Login/")
Observable<JsonObjBase<LoginBean>> login(@FieldMap Map<String, String> map);
/**
* 登出
*
* @param map
* @return
*/
@Headers({URL_2})
@FormUrlEncoded
@POST("/Account/Logout/")
Observable<JsonObjBase> logout(@FieldMap Map<String, String> map);
增加多url的headers,例如:url_1/url_2
然后在Retrofit的实体类中,增加Interceptor
Interceptor baseUrlInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
// 获取request
Request request = chain.request();
// 从request中获取原有的HttpUrl实例oldHttpUrl
HttpUrl oldHttpUrl = request.url();
// 获取request的创建者builder
Request.Builder builder = request.newBuilder();
// 从request中获取headers,通过给定的键url_name
List<String> headerValues = request.headers("url_name");
if (headerValues != null && headerValues.size() > 0) {
// 如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader("url_name");
// 匹配获得新的BaseUrl
String headerValue = headerValues.get(0);
Log.d("headerValue", headerValue);
HttpUrl newBaseUrl = null;
if ("url_1".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(Constants.BASE_URL_1);
} else if ("url_2".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(Constants.BASE_URL_2);
}else {
newBaseUrl = oldHttpUrl;
}
// 重建新的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());
}
return chain.proceed(request);
}
};
通过 String headerValue = headerValues.get(0); 获得 headerValue 然后判断 headerValue 的值去更改url,同理方法也能更改端口号等别的信息
然后在初始化OkHttpClient的时候将interceptor添加上
//初始化一个OkHttpClient
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(30000, TimeUnit.MILLISECONDS)
.readTimeout(30000, TimeUnit.MILLISECONDS)
.writeTimeout(30000, TimeUnit.MILLISECONDS);
builder.addInterceptor(interceptor);
builder.addInterceptor(baseUrlInterceptor);
OkHttpClient okHttpClient = builder.build();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//使用该OkHttpClient创建一个Retrofit对象
mRetrofit = new Retrofit.Builder()
//添加Gson数据格式转换器支持
.addConverterFactory(GsonConverterFactory.create())
//添加RxJava语言支持
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//指定网络请求client
.client(okHttpClient)
.baseUrl(BASE_URL)
.build();
最后再去试试网络请求看看