前言
最近好幾個(gè)朋友問我眠寿,多Url怎么處理落恼,這里我們就說說這個(gè)。
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝(一)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之文件下載(二)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之文件上傳(三)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之常見問題(四)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之?dāng)帱c(diǎn)下載(五)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之?dāng)?shù)據(jù)預(yù)處理(六)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之多Url(七)
- 【Android架構(gòu)】基于MVP模式的Retrofit2+RXjava封裝之Token的刷新(八)
套路一
Retrofit2是支持全路徑的,比如說
@GET("http://api.csslcloud.net/api/room/create")
Observable<String> createRoom(@Path("param") String param);
所以羞芍,項(xiàng)目中只有個(gè)別接口需要的話堂竟,完全可以使用配置全路徑這種方式魂毁。
套路二
保留多個(gè)Retrofit
對(duì)象
在之前的代碼中,Retrofit
一直是單例的出嘹,這里我們可以創(chuàng)建2個(gè)Retrofit
對(duì)象
retrofit = new Retrofit.Builder()
.baseUrl(BASE_SERVER_URL)
.addConverterFactory(BaseConverterFactory.create())
//支持RxJava2
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
retrofit2 = new Retrofit.Builder()
.baseUrl(BASE_SERVER_URL2)
.addConverterFactory(BaseConverterFactory.create())
//支持RxJava2
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
apiServer = retrofit.create(ApiServer.class);
apiServer2 = retrofit2.create(ApiServer.class);
然后在使用時(shí)席楚,區(qū)分
/**
* 獲取微分享列表
*/
public void getShareList() {
...省略代碼...
ApiServer apiServer = ApiRetrofit2.getInstance().getApiService();
...省略代碼...
}
/**
* 獲取微分享列表
*/
public void getShareList2() {
...省略代碼...
ApiServer apiServer = ApiRetrofit2.getInstance().getApiService2();
...省略代碼...
}
當(dāng)然這里也就說說而已,估計(jì)沒人會(huì)這么用...
套路三
思路是烦秩,通過Okhttp
的攔截器,動(dòng)態(tài)改變接口的地址郎仆,那攔截器里如何知道每個(gè)接口該使用哪個(gè)主地址呢只祠?
這里可以使用head
,請(qǐng)求時(shí)丸升,添加固定的標(biāo)志head铆农,然后在攔截器中判斷,完成替換狡耻。
如何實(shí)現(xiàn)
首先期揪,在ApiServer
中定義接口界轩,添加head
/**
* 獲取分享列表
*
* @return
*/
@FormUrlEncoded
@POST("module/index.php?")
@Headers({"url_mark:1"})
Observable<List<ShareModel>> getShareList2(@FieldMap Map<String, String> map);
/**
* 獲取分享列表
*
* @return
*/
@FormUrlEncoded
@POST("module/index.php?")
@Headers({"url_mark:2"})
Observable<List<ShareModel>> getShareList3(@FieldMap Map<String, String> map);
然后在Interceptor
判斷head
private Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e(TAG, "----------Request Start----------------");
Log.e(TAG, "| OldUrl=" + request.url().toString());
List<String> mark = request.headers("url_mark");
HttpUrl newUrl = null;
if (mark != null && mark.size() > 0) {
Log.e(TAG, "| Head=" + mark.get(0));
if (mark.get(0).equals("1")) {
newUrl = HttpUrl.parse("http://www.baidu.com/");
} else if (mark.get(0).equals("2")) {
newUrl = HttpUrl.parse("http://www.github.com/");
} else {
newUrl = request.url();
}
request = request.newBuilder().url(newUrl).build();
}
Log.e(TAG, "| NewUrl=" + request.url().toString());
long startTime = System.currentTimeMillis();
Response response = chain.proceed(request);
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
MediaType mediaType = response.body().contentType();
String content = response.body().string();
Log.e(TAG, "| " + request.toString());
Log.e(TAG, "| Response:" + content);
Log.e(TAG, "----------Request End:" + duration + "毫秒----------");
return response.newBuilder()
.body(ResponseBody.create(mediaType, content))
.build();
}
};
結(jié)果如下:
image.png
當(dāng)然,這里是寫死的判斷茬贵,實(shí)際開發(fā)中郊霎,可能是提前知道或者接口返回具體哪些接口地址沼头,可以存放在Map中,這里直接取值就好书劝。
最后进倍,獻(xiàn)上源碼 Github
RetrofitUrlManager
還提供了了更加豐富的替換規(guī)則,詳情可以查看源碼购对。