Android的OkHttp包中的HTTP拦截器Interceptor用法示例_Android

OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去。例如:
1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容。
2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去。
在 okHttp 中分成 Application Interceptor 和 Network Interceptor 两种。 Application Interceptor 是会可以被 cache 起来的。如官网的图片: 

拦截器是 OkHttp 提供的对 HTTP 请求和响应进行统一处理的强大机制。拦截器在实现和使用上类似于 Servlet 规范中的过滤器。多个拦截器可以链接起来,形成一个链条。拦截器会按照在链条上的顺序依次执行。 拦截器在执行时,可以先对请求的 Request 对象进行修改;再得到响应的 Response 对象之后,可以进行修改之后再返回。
Interceptor 接口只包含一个方法 intercept,其参数是 Chain 对象。Chain 对象表示的是当前的拦截器链条。通过 Chain 的 request 方法可以获取到当前的 Request 对象。在使用完 Request 对象之后,通过 Chain 对象的 proceed 方法来继续拦截器链条的执行。当执行完成之后,可以对得到的 Response 对象进行额外的处理。
记录请求和响应信息的拦截器:

public class LoggingInterceptor implements Interceptor {
public Response intercept(Chain chain) throws IOException {
 Request request = chain.request();

 long t1 = System.nanoTime();
 System.out.println(String.format("发送请求: [%s] %s%n%s",
   request.url(), chain.connection(), request.headers()));

 Response response = chain.proceed(request);

 long t2 = System.nanoTime();
 System.out.println(String.format("接收响应: [%s] %.1fms%n%s",
   response.request().url(), (t2 - t1) / 1e6d, response.headers()));

 return response;
}
}

OkHttp 中的拦截器分成应用和网络拦截器两种。应用拦截器对于每个 HTTP 响应都只会调用一次,可以通过不调用 Chain.proceed 方法来终止请求,也可以通过多次调用 Chain.proceed 方法来进行重试。网络拦截器对于调用执行中的自动重定向和重试所产生的响应也会被调用,而如果响应来自缓存,则不会被调用。
添加应用和网络拦截器

client.interceptors().add(new LoggingInterceptor()); //添加应用拦截器
client.networkInterceptors().add(new LoggingInterceptor()); //添加网络拦截器

要做计算 Request 的 sigunature ,则使用方式如下:

public class ApiClient {
 Interceptor signedRequestInterceptor = new Interceptor() {
  @Override
  public Response intercept(Chain chain) throws IOException {
   Response response = null;
   try {
    Request originalRequest = chain.request();
    Request signedRequest = SignRequestUtil.signRequest(originalRequest);
    response = chain.proceed(signedRequest);
   } catch (NoSuchAlgorithmException | InvalidKeyException e) {
     e.printStackTrace();
   }

   return response;
  }
 };

 OkHttpClient client = new OkHttpClient();
 client.networkInterceptors().add(signedRequestInterceptor);
}
public class SignRequestUtil {
 public static Request signRequest(Request originalRequest) {
  Request.Builder requestBuilder = originalRequest.newBuilder();

  // 在这做所有你需要做的事情,重新产生一个 Request 送出去。
  return requestBuilder
   .headers(getSignedHeaders(originalRequest))
   .build();
 }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, okhttp
, http
, interceptor
拦截器
okhttp interceptor、okhttp3 interceptor、okhttp 的interceptor、okhttp拦截器、okhttp3 拦截器,以便于您获取更多的相关知识。

时间: 2024-09-04 22:41:22

Android的OkHttp包中的HTTP拦截器Interceptor用法示例_Android的相关文章

Android的OkHttp包中的HTTP拦截器Interceptor用法示例

OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去.例如: 1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容. 2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去. 在 okHttp 中分成 Application Interceptor 和 Network Interceptor 两种. A

Android使用OKHttp包处理HTTP相关操作的基本用法讲解_Android

OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势.(GitHub页:https://github.com/square/okhttp) Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求.但更高效的使用HTTP 可

Android TextView中文字通过SpannableString设置属性用法示例_Android

本文实例讲述了Android TextView中文字通过SpannableString设置属性的方法.分享给大家供大家参考,具体如下: 在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. //创建一个 SpannableString对象 SpannableStri

Android使用OKHttp包处理HTTP相关操作的基本用法讲解

OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,还有透明的GZIP压缩,请求缓存等优势.(GitHub页:https://github.com/square/okhttp) Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求.但更高效的使用HTTP 可

androidjavaclass-关于Unity调用android的jar包中的接口

问题描述 关于Unity调用android的jar包中的接口 void Update () { AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic ("currentActivity"); int i = jo.Call ("Max",new object[]{10,20

jersey-Jersey+Spring程序中如何实现拦截器

问题描述 Jersey+Spring程序中如何实现拦截器 如题,项目中采用了Jersey+Spring实现Restful webservice,现在要对接口进行身份验证,方案已经确定,但如何实现类似于struts或SpringMVC的interceptor的效果?对所有请求进行身份验证1,备选方案是利用J2EE的filter2,想通过Spring的AOP来实现,切面是Jersey的Resource,但怎样注入HttpServletRequest呢? 解决方案 Jersey本身就提供了Reques

页面-struc2 中的 interceptors 拦截器 怎么能够返回字符串

问题描述 struc2 中的 interceptors 拦截器 怎么能够返回字符串 2C struc2 中的 interceptors 拦截器 怎么能够返回字符串 原来返回的是到页面jsp现在改成字符串 解决方案 用response write 然后 return null; 解决方案二: 你是想返回json数据吧!在原来struts.xml 返回的jsp 配置成返回类型是json, 解决方案三: PrintWriter out = response.getWriter(); out.print

spring 拦截方法中如何获取拦截器中变量的值

问题描述 spring 拦截方法中如何获取拦截器中变量的值 想在拦截方法中获取拦截器中变量的值,如何用代码实现?求指教.

php类中的各种拦截器用法分析_php技巧

本文实例讲述了php类中的各种拦截器用法.分享给大家供大家参考.具体用法分析如下: 1.__get( $property ) 访问未定义的属性时调用 复制代码 代码如下: class lanjie  {      function __get($name)      {          echo $name." property not found! ";      }  }  $ob = new lanjie();  echo $ob->g; 当我们调用对象$ob未定义的属性