使用Retrofit請求時需要多個baseurl動態(tài)切換

第一步、在service代碼中添加@Headers():

@Headers("urlname:test1")

@GET("地址1")

Observable<BaseResponse<List<Bean>>> getHData(@QueryMap Map<String, String> map);

@Headers("urlname:test2")

@GET("地址2")

Observable<BaseResponse<List<Bean>>> getJData(@QueryMap Map<String, String> map);

主要是添加headers請求頭,按照urlname(可改):url? 鍵值對的形式去說明

第二步、添加okhttpclient攔截器,捕獲添加的Headers,然后修改baseURL

public class BaseUrlInterceptor implements 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<String> headerValues = request.headers("urlname");

? ? ? ? if (headerValues != null && headerValues.size() > 0) {

? ? ? ? ? ? //如果有這個header,先將配置的header刪除,因此header僅用作app和okhttp之間使用

? ? ? ? ? ? builder.removeHeader("urlname");

? ? ? ? ? ? //匹配獲得新的BaseUrl

? ? ? ? ? ? String headerValue = headerValues.get(0);

? ? ? ? ? ? HttpUrl newBaseUrl = null;

? ? ? ? ? ? if ("test1".equals(headerValue)) {

? ? ? ? ? ? ? ? newBaseUrl = HttpUrl.parse(BASE_URL1);

? ? ? ? ? ? }else if ("test2".equals(headerValue)) {

? ? ? ? ? ? ? ? newBaseUrl = HttpUrl.parse(BASE_URL2);

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? newBaseUrl = oldHttpUrl;

? ? ? ? ? ? }

? ? ? ? ? ? //重建新的HttpUrl,修改需要修改的url部分

? ? ? ? ? ? HttpUrl newFullUrl = oldHttpUrl

? ? ? ? ? ? ? ? ? ? .newBuilder()

? ? ? ? ? ? ? ? ? ? .scheme("https")//更換網(wǎng)絡協(xié)議

? ? ? ? ? ? ? ? ? ? .host(newBaseUrl.host())//更換主機名

? ? ? ? ? ? ? ? ? ? .port(newBaseUrl.port())//更換端口

? ? ? ? ? ? ? ? ? ? .removePathSegment(0)//移除第一個參數(shù)

? ? ? ? ? ? ? ? ? ? .build();

? ? ? ? ? ? //重建這個request,通過builder.url(newFullUrl).build();

? ? ? ? ? ? // 然后返回一個response至此結(jié)束修改

? ? ? ? ? ? Log.e("Url", "intercept: "+newFullUrl.toString());

? ? ? ? ? ? return chain.proceed(builder.url(newFullUrl).build());

? ? ? ? }

? ? ? ? return chain.proceed(request);

? ? }

}

以上是實際代碼處理

第三步、在okhttpclient中設置

//創(chuàng)建一個OkHttpClient并設置超時時間

? ? ? ? OkHttpClient client = new OkHttpClient.Builder()

? ? ? ? ? ? ? ? .readTimeout(READ_TIME_OUT, TimeUnit.MILLISECONDS)

? ? ? ? ? ? ? ? .connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS)

? ? ? ? ? ? ? ? .addInterceptor(mRewriteCacheControlInterceptor)//沒網(wǎng)的情況下

? ? ? ? ? ? ? ? .addNetworkInterceptor(mRewriteCacheControlInterceptor)//有網(wǎng)的情況下

? ? ? ? ? ? ? ? .addInterceptor(new BaseUrlInterceptor())

? ? ? ? ? ? ? ? .addInterceptor(logInterceptor)

? ? ? ? ? ? ? ? .cache(cache)

? ? ? ? ? ? ? ? .build();

實際就是添加了攔截器,最后需要將okhttp設置進去Retrofit中。

文章引用https://blog.csdn.net/li18518326892/article/details/86640881

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容