Retrofit解决多个BaseURL切换的问题
来源:互联网 发布:守望先锋性能数据fps 编辑:程序博客网 时间:2024/06/07 16:21
说明:对于一些功能,需要多个BaseURl来请求不同服务器地址的api,我不可能有几个BaseURl,我就实例化几个Retrofit实例。这样做很不科学,要是BaseURl有上百个那个工作量是没法去估计的。为了解决这个问题方法如下:
运用应用拦截器Interceptor,来获取到app到okhttp中间层的request,对它进行修改、处理。
步骤如下:
这是两个api的BaseUrl
public class Api { public static final String base_url = "http://172.0.0.92:8080/"; public static final String base_url_mdffx = "http://11.254.16.19/";}
在RetrofitService(我的命名为:IRxJavaService)中要对接口配置@Headers({"key:value"})
public interface IRxjavaService { @Headers({"urlname:manage"}) @POST("members/auth") Observable<LoginBean> doLogin(@Body RequestBody requestBody); @Headers({"urlname:mdffx"}) @FormUrlEncoded @POST("login") Observable<LoginMdffxBean> doLoginMdffx(@Field("username") String username,@Field("password") String password); @Headers({"urlname:manage"}) @GET("members/datas") Observable<TongjiDataBean> doData(@Query("type") int type,@Query("params") int params);}
添加应用拦截器如下:(配置OkhttpClient的方法)
public OkHttpClient getokhttpClient() { if (httpClient == null) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient = new OkHttpClient.Builder() //处理多BaseUrl,添加应用拦截器 .addInterceptor(new MoreBaseUrlInterceptor()) //添加头部信息 .addInterceptor(new AddHeadersInterceptor()) .addNetworkInterceptor(httpLoggingInterceptor) .readTimeout(5, TimeUnit.SECONDS) .connectTimeout(5, TimeUnit.SECONDS) .build(); } return httpClient; }
定义一个拦截器
public class MoreBaseUrlInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //获取原始的originalRequest Request originalRequest = chain.request(); //获取老的url HttpUrl oldUrl = originalRequest.url(); //获取originalRequest的创建者builder Request.Builder builder = originalRequest.newBuilder(); //获取头信息的集合如:manage,mdffx List<String> urlnameList = originalRequest.headers("urlname"); if (urlnameList != null && urlnameList.size() > 0) { //删除原有配置中的值,就是namesAndValues集合里的值 builder.removeHeader("urlname"); //获取头信息中配置的value,如:manage或者mdffx String urlname = urlnameList.get(0); HttpUrl baseURL=null; //根据头信息中配置的value,来匹配新的base_url地址 if ("manage".equals(urlname)) { baseURL = HttpUrl.parse(Api.base_url); } else if ("mdffx".equals(urlname)) { baseURL = HttpUrl.parse(Api.base_url_mdffx); } //重建新的HttpUrl,需要重新设置的url部分 HttpUrl newHttpUrl = oldUrl.newBuilder() .scheme(baseURL.scheme())//http协议如:http或者https .host(baseURL.host())//主机地址 .port(baseURL.port())//端口 .build(); //获取处理后的新newRequest Request newRequest = builder.url(newHttpUrl).build(); return chain.proceed(newRequest); }else{ return chain.proceed(originalRequest); } }}
测试方案:同时在Activity的onCreate()方法里写两个联网的方法就ok,基本的思路和代码都已经写了,这里就不多说明了,有问题可以留言!
参考地址:https://www.2cto.com/kf/201708/663977.html
阅读全文
0 0
- Retrofit解决多个BaseURL切换的问题
- 使用retrofit做为网络请求时,解决多个BaseURL切换的问题
- !!!解决Retrofit多BaseUrl及运行时动态改变BaseUrl?
- Retrofit 2在开发中进行更改多个baseurl
- 解决retrofit2只用BaseUrl地址的问题
- 解决底部工具栏切换多个view的问题
- Retofit针对动态的BaseUrl解决
- html解决IE浏览器多个flash,来回切换,不能再次播放的问题
- 1Activity+多个Fragment模式下进行横竖屏切换的问题及解决方式
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- Android学习之解决多个Fragment切换时重新实例化的问题
- Android解决多个Fragment切换时布局重新实例化问题(挺详细的)
- Retrofit(OKHttp)多BaseUrl情况下url实时自动替换完美解决方法
- Retrofit 2 运行时改变BaseUrl
- retrofit 请求,BaseURL部分缺失,踩坑
- jqueryMobile 两个页面切换,第二个页面css样式没有加载的问题,已解决
- jqueryMobile 两个页面切换,第二个页面css样式没有加载的问题,已解决
- yum 的baseurl源报错
- 关于堆和栈的详细解释
- IDEA注册码/DataGrip注册码
- hibernate 缓存
- 浅谈Chrome开发者工具--- Console面板与常见报错类型
- 你好,层叠样式表
- Retrofit解决多个BaseURL切换的问题
- CentOS6.3安装AMP 和 phpMyadmin
- 99%的人都理解错了HTTP中GET与POST的区别
- [数论杂题] BZOJ1951: [Sdoi2010]古代猪文
- struts2_day01_03_struts2入门案例(一)(二)_05_struts2基本执行过程
- java中的==
- ELK日志监控系统搭建
- opencv3中的VideoWrite类中的open函数
- 事物的隔离级别和传播特性