Как скомпилировать ответ из нескольких запросов с помощью Spring WebClient - PullRequest
0 голосов
/ 16 марта 2020

Я хочу сделать прокси контроллер. Я получаю один HTTP-запрос и мне нужно передать его другим службам, затем скомпоновать ответы из ответов в один и отправить обратно. Если один ответ содержит исключение, ResponseEntity не должно быть с кодом 200 (ОК).

@PostMapping("**")
public ResponseEntity<String> processIn(@RequestHeader HttpHeaders headers, @RequestBody String body,  ServerHttpRequest request) {

    Mono<String> firstAnswer = sendRequest(headers, body, "https://localhost:1443");
    Mono<String> secondAnswer = sendRequest(headers, body, "http://localhost:8080");

    return ResponseEntity.ok().body(format("1: %s \n 2: %s", firstAnswer, secondAnswer));
}

private Mono<String> sendRequest(HttpHeaders headers, String body, String url) {
        return webClient.post()
                .uri(new URI(url))
                .headers(httpHeaders -> new HttpHeaders(headers))
                .bodyValue(body)
                .retrieve()
                .bodyToMono(String.class)
                .doOnNext(ans -> log.info(">>>>request to {} : {}", url, ans))
                .doOnError(err -> log.error(">>>>error sending to {}", url));
    }

1 Ответ

1 голос
/ 16 марта 2020

Вы можете попробовать что-то вроде этого. Я использовал здесь «блок», так как вы хотели вернуть ResponseEntity напрямую.

firstAnswer.zipWith(secondAnswer)
        .map(tuple -> String.format("1: %s \n 2: %s", tuple.getT1(), tuple.getT2()))
        .map(ResponseEntity::ok)
        .onErrorReturn(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build())
        .block();

Вместо этого вы можете удалить block, изменив тип возврата на Mono<ResponseEntity>

firstAnswer.zipWith(secondAnswer)
        .map(tuple -> String.format("1: %s \n 2: %s", tuple.getT1(), tuple.getT2()))
        .map(ResponseEntity::ok)
        .onErrorReturn(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
...