网络框架拦截的处理方式 网络拦截器
2017-07-20 17:11
357 查看
网络拦截器
当我们在进行封装网络框架的时候,避免不了要在请求的url上加上我们特定参数。如在请求的头部添加版本号、系统标示、缓存、日志拦截等。那么如何去处理这个需求呢?可以通过以下几个方法来进行处理。
源码下载地址:http://download.csdn.net/detail/gl_mine_csdn/9905444参数相关
方式一
public class CommonInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //获取请求 oldRequest Request oldRequest = chain.request(); //------------------------处理------------------------------- //得到 builder FormBody.Builder builder = new FormBody.Builder(); //设置 版本号 builder.add("VersionName","1.0.0"); //设置 机型 1(安卓) 2(IOS) builder.add("System","1"); //获取 FromBody FormBody body =builder.build(); //------------------------处理------------------------------- Request newRequest = oldRequest.newBuilder() .method(oldRequest.method(), oldRequest.body()) .url(oldRequest.url()) .headers(oldRequest.headers()) .addHeader("AppVersion", "1.0.0")//增加请求的头部 .post(body) .build(); return chain.proceed(newRequest); } }
方式二
public class CommonInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //获取请求 oldRequest Request oldRequest = chain.request(); //------------------------处理------------------------------- // 添加新的参数 HttpUrl.Builder builder = oldRequest.url().newBuilder() //设置 机型 1(安卓) 2(IOS) .addQueryParameter("System", "1") //设置 版本号 .addQueryParameter("VersionName", "1.0.0") //设置 scheme .scheme(oldRequest.url().scheme()) //设置 host .host(oldRequest.url().host()); //------------------------处理------------------------------- //构建 新的请求 Request newRequest = oldRequest.newBuilder() .addHeader("AppVersion", "1.0.0") .method(oldRequest.method(), oldRequest.body()) .url(builder.build()) .build(); return chain.proceed(newRequest); } }
日志拦截相关
方式一
//------------------------处理------------------------------- //HttpLoggingInterceptor 为Okhttp3自带的网络日志拦截器根据设置Level来选择拦截不同的信息 //常用的设置:BODY、HEADERS、BASIC、NONE HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); //通过okhttpBuilder 进行日志拦截的设置 okhttpBuilder.addInterceptor(loggingInterceptor); //------------------------处理-------------------------------
方式二
public class CommonHttpLoggingInterceptor implements Interceptor { @Override bf6d public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //------------------------处理------------------------------- //打印 url Logger.d("接口请求:", request.url().toString()); //打印 body Logger.d("接口参数:",request.body()); Response response = chain.proceed(request); if (null!=response && null!=response.body() ) { //获取 MediaType MediaType mediaType = response.body().contentType(); //获取 结果体 body String content = response.body().string(); //打印 请求结果 Logger.d("接口响应:", content); return response.newBuilder() .body(ResponseBody.create(mediaType, content)) .build(); } //------------------------处理------------------------------- return response; } }
缓存相关
方式一
public class CommonCacheInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); //------------------------处理------------------------------- if (!AppUtils.isNetworkAvailable(PayApp.application)) { // 无网络状态走缓存 request = request .newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); Response responseLatest; //------------------------处理------------------------------- //设置缓存存放时间 if (AppUtils.isNetworkAvailable(getApplication())) { int maxAge = 60 * 60; responseLatest = response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") //有网时候读接口上的@Headers里的配置 .header("Cache-Control", request.cacheControl().toString()) //或者 .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { int maxStale = 60 * 60 * 24 * 7; // 没网一周后失效 responseLatest = response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } //------------------------处理------------------------------- return responseLatest; } }
相关文章推荐
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式方法
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
- SpringMVC 拦截器不拦截静态资源的三种处理方式
- Android: WebView加载网页的几种方式及网络异常处理
- 网络拦截器以及使用方式
- libevent高性能网络库源码分析——事件处理框架(四)
- c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据
- 框架调用处理程序的方式
- 从零开始写Go网络通信框架(3)——对长连接的处理
- Android网络处理框架Volley介绍说明
- 几个网络访问框架的post请求使用方式