android 多个url请求,[Android]Retrofit多base_url请求解决方案
在項目中偶爾會碰到多base_url的情況,其實這個做法很討厭,但是后端又沒辦法才這樣做的,當使用retrofit作為網(wǎng)絡(luò)框架的時候,出現(xiàn)多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> login(@FieldMap Map map);
/**
* 登出
*
* @param map
* @return
*/
@Headers({URL_2})
@FormUrlEncoded
@POST("/Account/Logout/")
Observable logout(@FieldMap Map 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的創(chuàng)建者builder
Request.Builder builder = request.newBuilder();
// 從request中獲取headers,通過給定的鍵url_name
List 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()
// 更換網(wǎng)絡(luò)協(xié)議
.scheme(newBaseUrl.scheme())
// 更換主機名
.host(newBaseUrl.host())
// 更換端口
.port(newBaseUrl.port())
.build();
// 重建這個request,通過builder.url(newFullUrl).build();
// 然后返回一個response至此結(jié)束修改
return chain.proceed(builder.url(newFullUrl).build());
}
return chain.proceed(request);
}
};
通過 String headerValue = headerValues.get(0); 獲得 headerValue 然后判斷 headerValue 的值去更改url,同理方法也能更改端口號等別的信息
然后在初始化OkHttpClient的時候?qū)nterceptor添加上
//初始化一個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創(chuàng)建一個Retrofit對象
mRetrofit = new Retrofit.Builder()
//添加Gson數(shù)據(jù)格式轉(zhuǎn)換器支持
.addConverterFactory(GsonConverterFactory.create())
//添加RxJava語言支持
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//指定網(wǎng)絡(luò)請求client
.client(okHttpClient)
.baseUrl(BASE_URL)
.build();
最后再去試試網(wǎng)絡(luò)請求看看
result.png
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的android 多个url请求,[Android]Retrofit多base_url请求解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android自动更新列表,Androi
- 下一篇: 蓝思科技和苹果合作吗 是苹果产品玻璃盖板