OkHttp中interceptors拦截器

2023-12-26 04:08

本文主要是介绍OkHttp中interceptors拦截器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OkHttp拦截器是一种强大的机制,可以监视、重写和重试调用

1、LogInterceptor 示例代码
class LogInterceptor:Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val mRequest=chain.request()// startTimeval startTime=System.currentTimeMillis()LogUtil.D(log = "Sending request url== ${mRequest.url} " +" connection== ${chain.connection()} " +" headers==${mRequest.headers}")val mResponse=chain.proceed(mRequest)val endTime=System.currentTimeMillis()LogUtil.D(log="Received response url== ${mResponse.request.url} " +" costTime== ${endTime-startTime}ms"+" header== ${mResponse.headers}")return mResponse}
}
2、拦截器使用注意事项

调用chain.process(request)是每个拦截器实现的关键部分,该方法是所有HTTP请求产生响应的地方。如果chain.proceed(request)被多次调用,则必须关闭先前的响应体,否则会发生崩溃。

多个拦截器可以连接起来使用,假设有一个压缩拦截器和一个校验拦截器:你需要决定是先压缩数据然后校验,还是校验和然后压缩。OkHttp 使用列表来跟踪拦截器,拦截器按顺序调用。

3、OkHttp拦截器交互图

在这里插入图片描述

4、应用拦截器
  • 1、 添加应用拦截器
OkHttpClient.Builder().addInterceptor(LogInterceptor()).build()
  • 2 、请求www.baidu.com 查看应用拦截器日志
// requestD/tag: Sending request url== https://www.baidu.com/  connection== null  headers==// response
D/tag: Received response url== https://www.baidu.com/  costTime== 145ms header== Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transformConnection: keep-aliveContent-Type: text/htmlDate: Thu, 08 Jul 2021 07:38:20 GMTLast-Modified: Mon, 23 Jan 2017 13:23:46 GMTPragma: no-cacheServer: bfe/1.0.8.18Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/Transfer-Encoding: chunked
  • 3、应用拦截器只打印了一遍日志
6、使用网络拦截器 NetworkInterceptor

注册网络拦截器非常相似。调用addNetworkInterceptor()而不是addInterceptor()

  • 1、添加网络拦截器
OkHttpClient.Builder().addNetworkInterceptor(LogInterceptor()).build()
  • 2、请求https://www.publicobject.com/helloworld.txt,网络拦截器日志
 D/tag: Sending request url== https://www.publicobject.com/helloworld.txt  connection== Connection{www.publicobject.com:443, proxy=DIRECT hostAddress=www.publicobject.com/54.187.32.157:443 cipherSuite=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 protocol=http/1.1}  headers==User-Agent: OkHttp ExampleHost: www.publicobject.comConnection: Keep-AliveAccept-Encoding: gzipD/tag: Received response url== https://www.publicobject.com/helloworld.txt  costTime== 214ms header== Server: nginx/1.10.3 (Ubuntu)Date: Thu, 08 Jul 2021 09:30:19 GMTContent-Type: text/htmlContent-Length: 194Connection: keep-aliveLocation: https://publicobject.com/helloworld.txtD/tag: Sending request url== https://publicobject.com/helloworld.txt  connection== Connection{publicobject.com:443, proxy=DIRECT hostAddress=publicobject.com/54.187.32.157:443 cipherSuite=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 protocol=http/1.1}  headers==User-Agent: OkHttp ExampleHost: publicobject.comConnection: Keep-AliveAccept-Encoding: gzipD/tag: Received response url== https://publicobject.com/helloworld.txt  costTime== 493ms header== Server: nginx/1.10.3 (Ubuntu)Date: Thu, 08 Jul 2021 09:30:20 GMTContent-Type: text/plainContent-Length: 1759Last-Modified: Tue, 27 May 2014 02:35:47 GMTConnection: keep-aliveETag: "5383fa03-6df"Accept-Ranges: bytes
2021-07-08 17:30:23.855 19772-19847/com.example.myapplication D/tag:  get success  response=== okhttp3.internal.http.RealResponseBody@93be2de
  • 3、网络拦截器打印了两次日志,一次用于初始化请求,一次用于进行重定向请求。相较于普通拦截器网络拦截器包含更多的信息,包括Hosts、 Accept-Encoding等
7、应用拦截器与网络拦截器特点

1) 应用拦截器

  • 无需担心重定向和重试等中间响应。
  • 始终调用一次,即使 HTTP 响应是从缓存中提供的。
  • 遵循应用程序的原始意图。不关心 OkHttp 注入的标头,如If-None-Match.
  • 缓存命中时将拦截器短路,不调用Chain.proceed()。
  • 允许重试并多次调用Chain.proceed()。
  • 可以使用 withConnectTimeout、withReadTimeout、withWriteTimeout控制请求超时时长

2) 网络拦截器

  • 能够对重定向和重试等中间响应进行操作。
  • 不会因为使用缓存响应而不发生调用。
  • 可以像通过网络传输一样观察数据。
  • 以携带请求的方式访问Connection
8、重写请求
  • 应用拦截器可以用来添加、移除、替换请求头headers,能够用来转换requests中的请求体,下面为使用应用拦截器进行gzip压缩例子:
  • GzipRequestInterceptor
class GzipRequestInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val originRequest = chain.request()if (originRequest == null || originRequest.header("Content-Encoding") != null) {return chain.proceed(originRequest)}// compressedRequestval compressedRequest = originRequest.newBuilder().header("Content-Encoding", "gzip").method(originRequest.method, originRequest.body?.let { CustomRequestBody(it) }).build()return chain.proceed(compressedRequest)}
}class CustomRequestBody(body: RequestBody) : RequestBody() {private val mBody = bodyoverride fun contentType(): MediaType? {return mBody.contentType()}override fun writeTo(sink: BufferedSink) {val gzipSink = GzipSink(sink).buffer()mBody.writeTo(gzipSink)gzipSink.close()}override fun contentLength(): Long {return -1}}
9、重写响应
  • 通常情况下,OkHttp会帮我们处理响应头并返回响应体,但是一些业务中可能不满足需求,可以对响应头进行重写,满足需求。
  • 代码示例
class CacheAgeInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val mOriginRequest = chain.request()val mOriginResponse = chain.proceed(mOriginRequest)// setMaxCacheAgereturn mOriginResponse.newBuilder().header("Cache-Control", "max-age=60").build()}
}
  • 参考:https://square.github.io/okhttp/interceptors/

这篇关于OkHttp中interceptors拦截器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/538044

相关文章

Kafka拦截器的神奇操作方法

《Kafka拦截器的神奇操作方法》Kafka拦截器是一种强大的机制,用于在消息发送和接收过程中插入自定义逻辑,它们可以用于消息定制、日志记录、监控、业务逻辑集成、性能统计和异常处理等,本文介绍Kafk... 目录前言拦截器的基本概念Kafka 拦截器的定义和基本原理:拦截器是 Kafka 消息传递的不可或缺

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

【SpringMVC学习09】SpringMVC中的拦截器

Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法。 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的

Interceptor拦截器无法拦截根目录的解决方法

今天发现了一个bug,首页home.jsp的某一个值是通过拦截器拦截所有页面,然后赋值的,然而我们的首页是通过index.jsp直接引用首页home.jsp代码(如下),拦截器无法拦截。 <%@ include file="./WEB-INF/jsp/home.jsp" %> 首先,第一个解决方法就是,将首页的引用文件改为跳转即可 <html><head><meta http-equiv

okHttp框架的介绍 和关于https的自定义签名证书的问题

参考博客:【张鸿洋的博客】 Android Https相关完全解析 当OkHttp遇到Https 1.okhttp的介绍:  它能够处理: 一般的get请求一般的post请求基于Http的文件上传文件下载加载图片支持请求回调,直接返回对象、对象集合支持session的保持 开发平台使用:     使用前,对于Android Studio的用户,可以选择添加: compile '

OpenFeign请求拦截器,注入配置属性类(@ConfigurationProperties),添加配置文件(yml)中的token到请求头

一、需求 OpenFeign请求拦截器,注入配置属性类(@ConfigurationProperties),添加配置文件(yml)中的token到请求头 在使用Spring Boot结合OpenFeign进行微服务间调用时,需要在发起HTTP请求时添加一些默认的请求头,比如认证令牌(token)。为了实现这一功能,可以创建一个请求拦截器,并且通过@ConfigurationPropert

过滤器(Filter)和拦截器(Interceptor)

在Web开发中,过滤器(Filter)和拦截器(Interceptor)都是重要的组件,它们都可以对HTTP请求进行预处理、后处理以及一些额外的操作。然而,它们之间在多个方面存在明显的区别 1. 运行位置 过滤器(Filter):运行在Web服务器和Servlet容器之间的组件,可以拦截所有进出该容器的请求和响应。过滤器是Servlet规范的一部分,不依赖于特定的框架。拦截器(Intercep

Android 使用OkHttp

为什么需要一个HTTP库 Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。 关于HttpURLConnection和HttpClient的选择>>官方博客 尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。 OkHttp是一个相对成熟的解决方案,

SpringBoot 拦截器获取http请求参数—— 所有骚操作基础

目录 SpringBoot 拦截器获取http请求参数—— 所有骚操作基础 获取http请求参数是一种刚需定义拦截器获取请求为什么拦截器会重复调两遍呢?ServletInputStream(CoyoteInputStream) 输入流无法重复调用自定义 HttpServletRequestWrapper总结一下 展望一下 获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取ht

使用Spring Boot拦截器实现时间戳校验以防止接口被恶意刷

使用Spring Boot拦截器实现时间戳校验以防止接口被恶意刷 在开发Web应用程序时,接口被恶意刷请求(例如DDoS攻击或暴力破解)是一个常见的安全问题。为了提高接口的安全性,我们可以在服务端实现时间戳校验,以确保请求的合法性。本文将介绍如何在Spring Boot中使用拦截器来实现一个通用的时间戳验证机制。 一、为什么需要时间戳校验? 时间戳校验是一种简单而有效的安全措施。通过在请求中