Okhttp 拦截器 请求添加公共参数、公共Headers 方法
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 方法相关推荐
- Spring Boot 拦截器 请求参数MD5签名校验
拦截器定义 /*** 拦截器 请求参数签名校验* Created by jiyang on 14:47 2017/12/14*/ @Component @Slf4j public class Para ...
- vue 无法进入response拦截器_Vue添加请求拦截器
一.现象 统一处理错误及配置请求信息 二.解决 1.安装 axios , 命令: npm install axios --save-dev 2.在根目录的config目录下新建文件 axios.js ...
- OkHttp协议介绍以及文件下载和上传+OkHttp协议封装+OkHttp拦截器____SpringBoot——集成Okhttp3
OkHttp协议 okhttp是一个第三方类库,用于android中请求网络 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和LeakCan ...
- OkHttp - 拦截器篇
续 根据上一篇 核心流程 ,我们大致知道了okhttp的内部运转,但是对于网络请求的缓存.连接复用以及网络监控的功能的实现,我们是只知其然,而不知其所以然,我们只知道是负责各个功能的拦截器帮助我们完成 ...
- okHttp拦截器(转载)
OkHttp是由Square发布的一个HTTP client,它支持高速缓存服务器响应. 缓存: 如果服务器支持缓存,请求返回的Response会带有这样的Header:Cache-Control, ...
- 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解
一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...
- 拦截器手动添加spring注入方法
拦截器手动添加spring注入方法 : ActionContext actionContext = invocation.getInvocationContext(); ServletContext ...
- okHttp拦截器放在doGet和doPost请求中
public class OkHttp3Util { /** * 懒汉 安全 加同步 * 私有的静态成员变量 只声明不创建 * 私有的构造方法 * 提供返回实例 ...
- java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络
Retrofit和Okhttp和RxJava的封装 导入依赖 compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex. ...
最新文章
- S-T平面图中利用最短路求最小割(BZOJ 1001)
- MySQL主键与索引的联系和区别
- Node.js做的代理转发服务器
- 『Python』VS2015编译源码注意事项
- 从程序员到CTO都应该了解的一些技术趋势
- angular5 接口跨域请求配置
- 随心所欲的DateTime显示格式
- 电控无碳小车需要单片机吗_电控无碳小车的设计及研究
- 从折叠屏到AR 三星Galaxy新品预热宣传片大招频现
- 几个互联网巨头的社区团购还不收手?
- At present, Huawei has two more important
- 如何构建企业安全易用的数据资产
- 手机群控系统OpenSTF
- Debian 10 开启和停止 ufw防火墙
- ubuntu 下安装 qq wechat VirtualBox notepadqq
- Lsyncd:负载均衡之后,服务器的文件双向同步
- 【解决方案】如何通过国标GB28181协议视频平台EasyGBS搭建安监局危化品可视化监控平台?
- jenkins自动部署到tomcat/weblogic
- js网站服务器时间,js获取本地时间、服务器时间、记时
- 无源定位入门(三)AOA(2)测角代码(MUSIC和ROOT—MUSIC)