retrofit 基于okhttp。使用retrofit /okhttp时候,这些都会wifi
直连的,不走系统的wifi设置,代理是抓不到包的。所以如果
想抓包那么抓网卡吧,打印请求或者添加公共参数或者签名之类的话,可以使用拦截器来添加。

拦截器这里使用okhttp的应用拦截器,分别对get post添加统一参数和签名
首先实现 interceptor创建自己的拦截器

拦截器的 intercept方法的 Chain 可以获取请求响应 和请求头,可以随意添加参数请求头等等
首先是对请求添加版本号在请求头。可以在实现Interceptor方法的自定义拦截器里面这样写

@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//添加请求头request = request.newBuilder().addHeader("V", "appvesron").build()return chain.proceed(request);}

这样就添加了一个请求头。v版本号

2 然后是get方法 添加公共参数。比如说客户端类型了,时间戳,版本号等。。方法一样,代码如下

     @Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();if (request.method().equals("GET")) {//添加公共参数HttpUrl httpUrl = request.url().newBuilder().addQueryParameter("clienttype","1").addQueryParameter("imei", "imei").addQueryParameter("version", "VersionName").addQueryParameter("timestamp", String.valueOf(System.currentTimeMillis())).build();     request = request.newBuilder().url(httpUrl).build();  }return chain.proceed(request);}

对get请求添加统一封装参数,先从charin里面获取request,然后添加query参数。

3 在说下post方法添加参数,这个稍微麻烦一些

            @Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();if (request.method().equals("POST")) {if (request.body() instanceof FormBody) {FormBody.Builder bodyBuilder = new FormBody.Builder();FormBody formBody = (FormBody) request.body();//把原来的参数添加到新的构造器,(因为没找到直接添加,所以就new新的)for (int i = 0; i < formBody.size(); i++) {bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));}formBody = bodyBuilder.addEncoded("clienttype", "1").addEncoded("imei", "imei").addEncoded("version", "VersionName").addEncoded("timestamp", String.valueOf(System.currentTimeMillis())).build();request = request.newBuilder().post(formBody).build();}return chain.proceed(request);}
   post方法添加参数的稍微麻烦一下,点了半天,我也没有找到可以直接添加的方法,就新建了一个formbody 这样就可以统一添加 请求和参数,常用的get post都可以了。下面说一下cookie。  cookie 简答点,就算是请求头里面,和添加头方法一样。
   @Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//添加cookierequest = request.newBuilder().addHeader("Cookie", "cookie").build();return chain.proceed(request);}

我之前项目使用的 AsyncHttpClient。。已经有100多个api了,现在想用 retrofit 和rxjava,被以前的嵌套请求恶心着了。

替换之前的网络请求几乎是不可能了,就同时使用这两个框架。问题来了,cookie一开始搞不定。
cookie是之前AsyncHttpClient 来管理维护的。okhttp 添加的cookie是string串,这个自己拼接了,
取出之前的cookie来拼接好,传给okhttp。格式是实验好久才拼接对的

  private static String getCookie(List<Cookie> cookies) {StringBuilder builder = new StringBuilder();for (Cookie cookie : cookies) {builder.append(";");            builder.append(cookie.getName());builder.append("=");builder.append(cookie.getValue());builder.append("; domain=");builder.append(cookie.getDomain());
//                    if (cookie.getExpiryDate() != null) {
//                        builder.append("; expires=");
//                        calendar.setTime(cookie.getExpiryDate());
//                        builder.append(DateFormat.format("EEE, dd MMM yyyy hh:mm:ss z", calendar.getTimeInMillis()));
//                    }builder.append("; path=");builder.append(cookie.getPath());builder.append("; version=");builder.append(cookie.getVersion());}return builder.substring(1, builder.length());}

如果有多个cookie是通过;来拼接的好像说是通过了。 把这个设置到请求头就行了。

然后还有呢,就是添加签名,添加签名就试试再添加一个参数,不管get post的添加方法前面已经说了,自己再添加要给就行了,
就不单写了。

public class MyInterceptor implements Interceptor {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//添加请求头request = request.newBuilder().addHeader("V", MoKaApplication.getInst().VersionName()).build();//  添加cookieif (MokaRestClient.getCookies() != null && 0 < MokaRestClient.getCookies().size()) {request = request.newBuilder().addHeader("Cookie", getCookie(MokaRestClient.getCookies())).build();}if (request.method().equals("GET")) {request = addGetParams(request);} else if (request.method().equals("POST")) {request = addPostParams(request);}if (!Constants.RELEASE_CLIENT) {Log.d("mokaNet", URLDecoder.decode(request.url().toString(), "UTF-8"));Response response = chain.proceed(request);MediaType mediaType = response.body().contentType();String content = response.body().string();Log.d("mokaNet", content);return response.newBuilder().body(okhttp3.ResponseBody.create(mediaType, content)).build();} else {return chain.proceed(request);}}private static String getCookie(List<Cookie> cookies) {StringBuilder builder = new StringBuilder();for (Cookie cookie : cookies) {builder.append(";");builder.append(cookie.getName());builder.append("=");builder.append(cookie.getValue());builder.append("; domain=");builder.append(cookie.getDomain());
//                    if (cookie.getExpiryDate() != null) {
//                        builder.append("; expires=");
//                        calendar.setTime(cookie.getExpiryDate());
//                        builder.append(DateFormat.format("EEE, dd MMM yyyy hh:mm:ss z", calendar.getTimeInMillis()));
//                    }builder.append("; path=");builder.append(cookie.getPath());builder.append("; version=");builder.append(cookie.getVersion());}return builder.substring(1, builder.length());}//get请求 添加公共参数 签名private static Request addGetParams(Request request) {//添加公共参数HttpUrl httpUrl = request.url().newBuilder().addQueryParameter("clienttype", String.valueOf(NetConstants.CLIENT_TYPE_ANDROID))            .addQueryParameter("version","" ).addQueryParameter("timestamp", String.valueOf(System.currentTimeMillis())).build();//添加签名Set<String> nameSet = httpUrl.queryParameterNames();ArrayList<String> nameList = new ArrayList<>();nameList.addAll(nameSet);Collections.sort(nameList);StringBuilder buffer = new StringBuilder();for (int i = 0; i < nameList.size(); i++) {buffer.append("&").append(nameList.get(i)).append("=").append(httpUrl.queryParameterValues(nameList.get(i)) != null &&httpUrl.queryParameterValues(nameList.get(i)).size() > 0 ? httpUrl.queryParameterValues(nameList.get(i)).get(0) : "");}httpUrl = httpUrl.newBuilder().addQueryParameter("sign", MD5Util.MD5(buffer.toString())).build();request = request.newBuilder().url(httpUrl).build();return request;}//post 添加签名和公共参数private Request addPostParams(Request request) throws UnsupportedEncodingException {if (request.body() instanceof FormBody) {FormBody.Builder bodyBuilder = new FormBody.Builder();FormBody formBody = (FormBody) request.body();//把原来的参数添加到新的构造器,(因为没找到直接添加,所以就new新的)for (int i = 0; i < formBody.size(); i++) {bodyBuilder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i));}formBody = bodyBuilder.addEncoded("ctype", String.valueOf(NetConstants.CLIENT_TYPE_ANDROID))          .addEncoded("ver","" ).addEncoded("time", String.valueOf(System.currentTimeMillis())).build();Map<String, String> bodyMap = new HashMap<>();List<String> nameList = new ArrayList<>();for (int i = 0; i < formBody.size(); i++) {nameList.add(formBody.encodedName(i));bodyMap.put(formBody.encodedName(i), URLDecoder.decode(formBody.encodedValue(i), "UTF-8"));}StringBuilder builder = new StringBuilder();for (int i = 0; i < nameList.size(); i++) {builder.append("&").append(nameList.get(i)).append("=").append(URLDecoder.decode(bodyMap.get(nameList.get(i)), "UTF-8"));}formBody = bodyBuilder.addEncoded("sign", MD5Util.MD5(builder.toString())).build();request = request.newBuilder().post(formBody).build();}return request;}}

Okhttp 拦截器 请求添加公共参数、公共Headers 方法相关推荐

  1. Spring Boot 拦截器 请求参数MD5签名校验

    拦截器定义 /*** 拦截器 请求参数签名校验* Created by jiyang on 14:47 2017/12/14*/ @Component @Slf4j public class Para ...

  2. vue 无法进入response拦截器_Vue添加请求拦截器

    一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios  , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js ...

  3. OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3

    OkHttp协议 okhttp是一个第三方类库,用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...

  4. OkHttp - 拦截器篇

    续 根据上一篇 核心流程 ,我们大致知道了okhttp的内部运转,但是对于网络请求的缓存.连接复用以及网络监控的功能的实现,我们是只知其然,而不知其所以然,我们只知道是负责各个功能的拦截器帮助我们完成 ...

  5. okHttp拦截器(转载)

    OkHttp是由Square发布的一个HTTP client,它支持高速缓存服务器响应. 缓存: 如果服务器支持缓存,请求返回的Response会带有这样的Header:Cache-Control, ...

  6. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解

    一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...

  7. 拦截器手动添加spring注入方法

    拦截器手动添加spring注入方法 : ActionContext actionContext = invocation.getInvocationContext(); ServletContext  ...

  8. okHttp拦截器放在doGet和doPost请求中

    public class OkHttp3Util { /**      * 懒汉 安全 加同步      * 私有的静态成员变量 只声明不创建      * 私有的构造方法      * 提供返回实例 ...

  9. java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络

    Retrofit和Okhttp和RxJava的封装 导入依赖 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex. ...

最新文章

  1. S-T平面图中利用最短路求最小割(BZOJ 1001)
  2. MySQL主键与索引的联系和区别
  3. Node.js做的代理转发服务器
  4. 『Python』VS2015编译源码注意事项
  5. 从程序员到CTO都应该了解的一些技术趋势
  6. angular5 接口跨域请求配置
  7. 随心所欲的DateTime显示格式
  8. 电控无碳小车需要单片机吗_电控无碳小车的设计及研究
  9. 从折叠屏到AR 三星Galaxy新品预热宣传片大招频现
  10. 几个互联网巨头的社区团购还不收手?
  11. At present, Huawei has two more important
  12. 如何构建企业安全易用的数据资产
  13. 手机群控系统OpenSTF
  14. Debian 10 开启和停止 ufw防火墙
  15. ubuntu 下安装 qq wechat VirtualBox notepadqq
  16. Lsyncd:负载均衡之后,服务器的文件双向同步
  17. 【解决方案】如何通过国标GB28181协议视频平台EasyGBS搭建安监局危化品可视化监控平台?
  18. jenkins自动部署到tomcat/weblogic
  19. js网站服务器时间,js获取本地时间、服务器时间、记时
  20. 无源定位入门(三)AOA(2)测角代码(MUSIC和ROOT—MUSIC)

热门文章

  1. 路由设置代理ip的作用
  2. 脚本调试sh -x xx.sh、set -x
  3. 使用matlab绘制弧线,MATLAB求解叶型中弧线
  4. 面向对象之对象的多态性
  5. Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线
  6. 种植牙术后的注意事项
  7. 语音控制小车运动APP(基于百度语音识别)
  8. 微信开源PhxQueue:高可用、高可靠、高性能的分布式队列**
  9. 深度学习之DCN-v2
  10. jetson nano yolov5部署及USB摄像头实时检测 初次尝试