第一步、在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