OkHttp - 拦截器(Interceptor) 重新定义请求 Request
2016-08-07 16:37
507 查看
背景
项目使用的OkHttp和Retrofit,但目前要改了新的接口方式,不采用Restful的风格,所以对Retrofit的网络底层实现,是一个致命的打击。这时候就需要在OkHttp上做一些摸索了,即 - 拦截器 (InterCeptor)。思路
思路很简单:拿到请求的Request对象,改变请求地址和请求数据(or 重新封装),返回新的Request,继续进行请求。实现
(1)继承 Interceptor 接口,并实现intercept方法public class NetWorkInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { } }
(2)通过chain 对象获取Request对象
Request request = chain.request();
(3)通过request.body与FormBody 重新封装参数
if(request.body() instanceof FormBody) { FormBody body = (FormBody) request.body(); if (body.size() > 0) { //封装参数 for (int i = 0; i < body.size(); i++) { Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i)); Log.d(TAG, body.name(i) + " >>>> " + body.value(i)); params.getP().add(body.encodedValue(i)); } } }
(4)通过FormBody.Builder和Request.Builder重新生成Request
FormBody.Builder newFormBuilder=new FormBody.Builder(); newFormBuilder.addEncoded(PARAMS_DATA, CryptUtil.enCryPto(params)); Request.Builder builder=request.newBuilder(); builder.url(HTTP_HOST_API); builder.method(request.method(),newFormBuilder.build()); Request newRequest= builder.build();
(5)返回 Response
return chain.proceed(newrequest);
附件 :
具体见 :initRequest方法实现import android.util.Log; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; /** * Created by yuan on 2016/8/5. */ public class NetWorkInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Log.d(TAG,request.url().host()); if(request.url().host().equals(HTTP_OLD_HOST_API)){ //需要修改 //通过一些条件进行判断,然后返回新的Request switch (request.url().encodedPath()){ case HTTP_OLD_HOST_BANNER: Request initRequest = initRequest(request, maps.get(HTTP_OLD_HOST_BANNER)); return chain.proceed(initRequest); } } return chain.proceed(request); } /** * 重新封装参数 * @param request 旧的Request * @param params 封装的bean * @return 修改后的Request */ private Request initRequest(Request request,BaseNetParams params){ if(request.body() instanceof FormBody) { FormBody body = (FormBody) request.body(); if (body.size() > 0) { //封装参数 for (int i = 0; i < body.size(); i++) { Log.d(TAG, body.encodedName(i) + " >>>> " + body.encodedValue(i)); Log.d(TAG, body.name(i) + " >>>> " + body.value(i)); params.getP().add(body.encodedValue(i)); } } } FormBody.Builder newFormBuilder=new FormBody.Builder(); newFormBuilder.addEncoded(PARAMS_DATA, params); Request.Builder builder=request.newBuilder(); builder.url(HTTP_HOST_API); builder.method(request.method(),newFormBuilder.build()); return builder.build(); } }
相关文章推荐
- okhttp之自定义Interceptor:请求失败切换IP重试拦截器
- Retrofit2.0+OkHttp打印Request URL(请求地址参数)
- [置顶] Android OkHttp网络请求拦截器
- OkHttp框架的RetryAndFollowUpInterceptor请求重定向源码解析
- Spring拦截器中通过request获取到该请求对应Controller中的method对象
- Android OkHttp 源码解析 (四) Interceptor 应用层拦截器、网络层拦截器
- android RxJava+Retrofit2.0 OkHttp添加日志拦截器和设置请求头
- OKHttp3(支持Retrofit2)的网络数据缓存Interceptor拦截器
- 添加 retrfiot 拦截器Interceptor ,打印服务器返回的json并添加网络请求公共的header
- retrofit2.0使用拦截器Interceptor统一打印请求与响应的json
- struts2 拦截器Interceptor中取得request、response
- HttpWebRequest请求超时异常的处理方法(重新发送请求到成功为止)
- OkHttp:拦截器之网络请求Log
- Spring MVC 拦截器(2)-WebRequestInterceptor
- 使用Retrofit和Okhttp实现网络缓存。无网读缓存,有网根据过期时间重新请求 (转)
- HttpServletRequestWrapper采用装饰模式重新封装request,并打印request请求相关参数。
- 将请求的request的参数重新组装成map。主要是将空值的替换成null,因为requestMap空值是""
- Spring拦截器中通过request获取到该请求对应Controller中的method对象
- OKHttp使用拦截器(Interceptor)POST与GET方法,统一封装传公共参数
- Spring MVC 中 HandlerInterceptorAdapter的使用[SpringMVC中请求拦截器的实现]