Retrofit 动态修改BaseUrl
作者:互联网
最近项目有关需求,需要app在调用不同模块时,发起不同url的请求。经过查找资料发现可以通过retrofit的拦截器解决。
1.在网络请求接口中添加@Headers
在网络请求接口中添加@Headers({“url_name:xxx”})。
public interface RetrofitService
{
String URL_WEATHER = "url_name:weather";
String URL_BOOK = "url_name:book";
@Headers(URL_WEATHER)
@GET("/data/sk/{cityId}.html")
Observable<ResponseBody> getWeatherByCityId(@Path("cityId") String cityId);
@Headers(URL_BOOK)
@GET("/v2/book/search")
Observable<ResponseBody> getBook(@Query("q") String bookName);
}
对于retrofit网络请求参数的注解,可以查看Retrofit注解
2.自定义ChangeUrlInterceptor拦截器
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的创建者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);
HttpUrl newBaseUrl = null;
if ("weather".equals(headerValue))
{
newBaseUrl = HttpUrl.parse(UrlManager.BASE_URL_WEATHER);
}
else if ("book".equals(headerValue))
{
newBaseUrl = HttpUrl.parse(UrlManager.BASE_URL_BOOK);
}
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);
}
}
在拦截器中通过获取url_name来确定要调用哪个url。
3.addInterceptor
private RetrofitHelper()
{
OkHttpClient.Builder client = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
// 切换BaseUrl
.addInterceptor(new BaseUrlInterceptor());
OkHttpClient okHttpClient = client.build();
retrofit = new Retrofit.Builder()
.baseUrl(UrlManager.BASE_URL_WEATHER)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build();
}
四.调用
正常的网络调用即可。
标签:name,newBaseUrl,url,HttpUrl,URL,request,BaseUrl,修改,Retrofit 来源: https://blog.csdn.net/really_study/article/details/94597466