doc: 阅读webclient filter文档

This commit is contained in:
asahi
2025-05-29 12:44:43 +08:00
parent 4b03f8d44e
commit 5e565ecfc6

View File

@@ -394,4 +394,61 @@ WebClient client = webClient.mutate()
}) })
.build(); .build();
``` ```
### filter处理response
在使用filter时需要`确保response content总是被消费`
- 当filter在处理response时需要确保filter总是
- 消费response content
- 或将response传递到下游
示例代码如下所示:
```java
public ExchangeFilterFunction renewTokenFilter() {
return (request, next) -> next.exchange(request).flatMap(response -> {
if (response.statusCode().value() == HttpStatus.UNAUTHORIZED.value()) {
return response.releaseBody()
.then(renewToken())
.flatMap(token -> {
ClientRequest newRequest = ClientRequest.from(request).build();
return next.exchange(newRequest);
});
} else {
return Mono.just(response);
}
});
}
```
如下示例创建了自定义的filter用于计算POST和PUT的`multipart/form-data`请求的`Content-Length`
```java
public class MultipartExchangeFilterFunction implements ExchangeFilterFunction {
@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
if (MediaType.MULTIPART_FORM_DATA.includes(request.headers().getContentType())
&& (request.method() == HttpMethod.PUT || request.method() == HttpMethod.POST)) {
return next.exchange(ClientRequest.from(request).body((outputMessage, context) ->
request.body().insert(new BufferingDecorator(outputMessage), context)).build()
);
} else {
return next.exchange(request);
}
}
private static final class BufferingDecorator extends ClientHttpRequestDecorator {
private BufferingDecorator(ClientHttpRequest delegate) {
super(delegate);
}
@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
return DataBufferUtils.join(body).flatMap(buffer -> {
getHeaders().setContentLength(buffer.readableByteCount());
return super.writeWith(Mono.just(buffer));
});
}
}
}
```