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

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();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值