使用方式
HttpClient支持通过builder配置和SPI加载两种方式配置Filter。
Filter分为RequestFilter和ResponseFilter两种,前者主要用于处理HttpRequest,在所有Interceptor对HttpRequest处理之后执行, 后者主要用于处理HttpResponse,在响应headers到达之后立即执行,此时所有拦截器对HttpResponse的处理均未开始执行。Interceptor的区别RequestFilter在所有拦截器对HttpRequest的处理之后才会执行,ResponseFilter在响应头接收到之后(响应body处理前)立即执行,此时所有拦截器对HttpResponse的处理均未执行。RequestFilter和ResponseFilter中均无法同时获取到请求和响应,因此也不能将两者关联起来,但是同一个请求将在RequestFilter和ResponseFilter中共享一个FilterContext实例,
因此可以通过该对象传递上下文参数。而Interceptor中可以获取HttpRequest经过处理后的HttpResponse,因此可以通过此种方式将请求和响应关联起来。RequestFilter或ResponseFilter无法替换原始的HttpRequest或HttpResponse,而通过Interceptor可以实现。鉴于Filter和Interceptor的区别,下述场景更适合使用Filter:
HttpRequest或HttpResponse,如:对每个HttpRequest或HttpResponse添加固定的请求header。HttpRequest处理过程中可能需要多次执行的逻辑,比如在发生重试、重定向时会发出多个网络请求,而这些请求均需要执行的逻辑。Filter之间通过getOrder()方法返回值区分执行顺序,值越小,优先级越高HttpRequest可以通过共享一个FitlerContext实例在多个RequestFilter和ResponseFilter实例间传递上下文参数HttpClient支持通过builder配置和SPI加载两种方式配置Filter。
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.