WebClient中响应正文的通用处理/验证

时间:2019-08-29 10:02:25

标签: spring-webflux

我有POST请求以使用WebFlux WebClient的类似REST的服务。该服务以常见的JSON格式返回响应,例如:

{
    "status": "OK",
    "data": []
}

现在,对于每个端点的每个WebClient调用,我都想执行通用验证以检查status ==“ OK”。我是否需要为每个端点分别调用验证,例如

myClient.post().uri("/myEndpoint1")
    //..
    .retrieve()
    .bodyToMono(MyResponse.class)
    .map(this::validateResponse)
    //..

或者有一种在创建WebClient时添加一些常见处理的方法。我尝试使用过滤器

this.myClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(HttpClient.create().wiretap()))
.filter(ExchangeFilterFunction.ofResponseProcessor(this::validateMyResponseAsFilter))
    .baseUrl(mybaseUrl)
    .build();

validateMyResponseAsFilter在哪里

private Mono<ClientResponse> validateMyResponseAsFilter(ClientResponse resp) {
    return resp.bodyToMono(MyResponse.class)
        .flatMap(myResponse -> "OK".equals(myResponse.getStatus()) ? Mono.just(resp) : Mono.error(new RuntimeException()));
  }

但这会导致

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/octet-stream' not supported for bodyType=my.package.MyResponse

1 个答案:

答案 0 :(得分:0)

原来,我连接的服务没有返回Content-Type标头。修复服务后,代码可以正常工作。