使用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);
}
}
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);
}
}
相关文章推荐
- Retrofit解决多个BaseURL切换的问题
- 解决使用webbrowser请求url时数据传递丢失问题
- 使用webView访问https的url-处理SslError解决android2.2版本之前的https请求问题
- 由Volley使用HttpURLConnection请求所引起的问题的解决过程
- Retrofit,Rxjava网络请求是 baseUrl 报错 IllegalArgumentException
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- springMVC框架在js中使用window.location.href请求url时IE不兼容问题解决
- 怎么解决重复提交的问题,即网络不好的时候,提交按钮点了一次,但是却发起了多次http url请求,数据库中写入了多条重复记录(当然ID是不重复的,因为毕竟是多条http url记录)
- 'Invalid parameter not satisfying: URLString'网络请求的时候get使用特殊字符和汉字崩溃的恶心bug解决方法
- IOS 使用AF网络请求统一RSA加密+URL不识别中文的解决办法
- react native 使用fetch进行网络请求(https),解决SSLHandshake问题,以及怎样进行二次封装
- springMVC框架在js中使用window.location.href请求url时IE不兼容问题解决
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
- Xcode7 不能使用http网络请求问题解决
- Alamofire的使用和网络请求的封装,解决不能打印中文的问题
- 如何使用URL跳转解决Web服务80端口被封问题?
- windows 2008初体验常见问题: 无线网络"没有正确配置为使用IP协议" 错误解决办法
- JSP使用base标签和时间控件时IE6下不能打开站点,已终止操作问题解决
- Microsoft Office Word 2007 切换窗口后鼠标无法使用问题的解决办法
- [网络收集]解决在母版页中使用Page.FindControl方法找不到指定控件的问题