您的位置:首页 > 理论基础 > 计算机网络

使用retrofit做为网络请求时,解决多个BaseURL切换的问题

2017-08-30 09:31 746 查看
      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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐