内容简介:因为有需求,才会有解决方案。本篇文章就是为了解决以下类似问题:实现思路也是比较简单的,只需要自己实现一个使用:
前言
因为有需求,才会有解决方案。本篇文章就是为了解决以下类似问题:
- 统一为所有接口加上一个参数,如
appType或则version - 统一为请求加上一个
header - 请求
path变更了,需要按照一定规则将path进行替换
实现
实现思路也是比较简单的,只需要自己实现一个 Interceptor ,然后加在其它 Interceptor 之前,具体代码如下:
/**
* 自定义的拦截器
* 1. 实现baseUrl的动态替换
* 2. path的替换
* 3. 增加parameter
* 3. 增加header
*/
final class HostSelectionInterceptor implements Interceptor {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
// 拿到请求
Request request = chain.request();
HttpUrl httpUrl = request.url();
HttpUrl.Builder newUrlBuilder = httpUrl.newBuilder();
// 替换host
String host = httpUrl.host();
// 这里是判断 当然真实情况不会这么简单
if (httpUrl.host().equals("api.github.com")) {
// 只是为了在demo中显示消息提示
sendMessage("\n\n替换url:www.baidu.com\n");
host = "www.baidu.com";
}
// 重新设置新的host
newUrlBuilder.host(host);
// 替换path
//List<String> pathSegments = httpUrl.pathSegments();
// 这里是我已经知道了我是要移除第一个路径,所以我直接就移除了
// 真实项目中,判断条件更加复杂
newUrlBuilder.removePathSegment(0);
// 将index的segment替换为传入的值
//newUrlBuilder.setPathSegment(index,segment);
// 添加参数
newUrlBuilder.addQueryParameter("version", "v1.3.1");
// 创建新的请求
request = request.newBuilder()
.url(newUrlBuilder.build())
.header("NewHeader", "NewHeaderValue")
.build();
// 只是为了在demo中显示消息提示
sendMessage("\n\n新请求地址和参数:" + request.url().toString() + "\n");
return chain.proceed(request);
}
}
使用:
retrofit = new Retrofit.Builder()
.client(new OkHttpClient.Builder()
.addInterceptor(getHttpLoggingInterceptor())
.addInterceptor(hostSelectionInterceptor)//加入自定义的拦截器
.build())
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
演示:
源码
软广
一个痴心妄想想成为一个全屏(栈)工程师的程序猿。
来来,关注一下吧!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 动态壁纸开发指南(一)概述介绍
- .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)
- 动态代理三部曲(一):动态代理模式及实现原理
- 你必须会的 JDK 动态代理和 CGLIB 动态代理
- 彻底搞懂jdk动态代理并自己动手写一个动态代理
- Android程序员必会技能---运行时动态生成类---之动态代理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。