代码之家  ›  专栏  ›  技术社区  ›  Keibosh

如何在春季处理HTTP 204无内容响应

  •  0
  • Keibosh  · 技术社区  · 3 年前

    从我的春季启动应用程序中,我使用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);
        }
    

    我是否应该重构代码,只允许空响应并以这种方式处理它,而不是在上面的代码中尝试这样做?

    0 回复  |  直到 3 年前