内置Interceptor
在HttpClient
中存在一些内置Interceptor
,用于实现 100-expect-continue、重试、重定向 等功能。
HttpRequest
处理过程中,有时可能需要执行Retry、Redirect、Cache等操作,使用Interceptor
可以实现类似功能。Filter
的区别与Filter
不同的是,在Interceptor
中
可以同时获取HttpRequest
及经过处理后的HttpResponse
,甚至可以替换原始的HttpRequest
及处理后的HttpResponse
。更多与Filter
的不同如下:
RequestFilter
在所有拦截器对HttpRequest
的处理之后才会执行,ResponseFilter
在响应头接收到之后(响应body处理前)立即执行,此时所有拦截器对HttpResponse
的处理均未执行。Interceptor
中可以获取HttpRequest
经过处理后的HttpResponse
,通过此种方式可以将请求和响应关联起来,而RequestFilter
和ResponseFilter
中均无法同时获取到请求和响应,因此
也不能将两者关联起来,但是同一个请求将在RequestFilter
和ResponseFilter
中共享一个FilterContext
实例,因此可以通过该对象传递上下文参数。HttpRequest
或HttpResponse
,而通过Filter
无法实现。鉴于Interceptor
和Filter
的区别,下述场景更适合使用Interceptor
:
HttpRequest
及HttpResponse
,如重试、重定向等(因为需要获取HttpRequest
处理结果后的HttpResponse
再决定下一步处理逻辑)。HttpRequest
处理过程中仅需要执行一次的逻辑,同时需要注意该类拦截器的优先级要高于重试、重定向等内置拦截器,否则发生重试、重定向时该拦类拦截器仍会被
多次执行。HttpRequest
或处理后的HttpResponse
。在HttpClient
中存在一些内置Interceptor
,用于实现 100-expect-continue、重试、重定向 等功能。
HttpClient
支持通过builder配置和SPI加载两种方式配置Interceptor
。
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.