Retrofit作为最火的网络请求框架,基本上都在使用。我们引入到项目中,并对其进行封装,同时指定了一个基本保持不变的baseUrl,但是,如果我们接入了第三方的sdk,需要请求第三方的url来获取相关数据的时候,就存在了一个问题相当严重的问题,第三方的baseUrl 并不是我们项目中所使用的,那该怎么办呢?
1.首先,我们不可能只改变一个baseUrl的值,把封装的代码在复制一遍,这样虽然能实现,但是有没有考虑过如果要接多个第三方的呢?(作为一个高大上,有洁癖的码农,有没有觉得这样很low)
2.我们可以使用强大的okhttp的拦截器进行拦截
private static 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("bqs_auth");
if (headerValues != null && headerValues.size() > 0) {
//如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
builder.removeHeader("bqs_auth");
//匹配获得新的BaseUrl
String headerValue = headerValues.get(0);
HttpUrl newBaseUrl = null;
if ("taobao".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(Base_URL_BQS);
}else if ("other".equals(headerValue)) {
newBaseUrl = HttpUrl.parse(Base_OTHER_UR);
}else{
newBaseUrl = oldHttpUrl;
}
//重建新的HttpUrl,修改需要修改的url部分
HttpUrl newFullUrl = oldHttpUrl
.newBuilder()
.scheme("https")//更换网络协议
.host(newBaseUrl.host())//更换主机名
.port(newBaseUrl.port())//更换端口
.removePathSegment(0)//移除第一个参数
.build();
//重建这个request,通过builder.url(newFullUrl).build();
// 然后返回一个response至此结束修改
Log.e("Url", "intercept: "+newFullUrl.toString());
return chain.proceed(builder.url(newFullUrl).build());
}
return chain.proceed(request);
}
}