从我的春季启动应用程序中,我使用SpringWebClient对API搜索服务进行了多次调用。这是必需的,因为分页和多个搜索参数不能一起使用。
当与某些参数进行通话时,我会收到HTTP 204无内容,这是完全正常的,也是意料之中的。但是,这会导致对我的响应对象的正文进行解码时出现问题
我试图在过滤器中处理204状态,但我所做的似乎有点不稳定,不知道应该如何处理。我是反应式风格的新手,但希望避免使用不推荐使用的RestTemplate风格。
.builder()
.filter(WebClientFilter.handleError())
.filter(responseFilter)
.clientConnector(new ReactorClientHttpConnector(HttpClient.create().followRedirect(true)))
... default header stuff ommitted ...
.build().post().uri(searchServiceUrl)
.body(BodyInserters.fromValue(createsearchRequest()))
.retrieve()
.bodyToMono(SearchResponse.class)
.block();
这里是我过滤204并返回一个新构建的带有空Dto的响应的地方。我用自己的响应替换服务器的响应,这似乎是错误的,但如果我不这样做,WebClient将返回null,从而导致其他问题。
private static Mono<ClientResponse> exchangeFilterResponseProcessor(ClientResponse response) {
HttpStatus status = response.statusCode();
if (HttpStatus.NO_CONTENT.equals(status)) {
return response.bodyToMono(String.class).flatMap(body -> {
log.info("Body is {}" , body);
ClientResponse emptyResponse = ClientResponse.create(HttpStatus.OK)
.header(CONTENT_TYPE, "application/json")
.body(new SearchResponse().toString())
.build();
return Mono.just(emptyResponse);
});
}
return Mono.just(response);
}
我是否应该重构代码,只允许空响应并以这种方式处理它,而不是在上面的代码中尝试这样做?