Получить http код ответа и все доступное тело - PullRequest
1 голос
/ 21 июня 2019

Я не хочу реализовывать пример клиента WebFlux, который может сделать запрос с параметрами http и получить тело ответа и код ответа http.Я попробовал это:

public ClientResponse execute(NotificationMessage nm)
Mono<String> transactionMono = Mono.just(convertedString);
        return client.post().uri(builder -> builder.build())
                .header(HttpHeaders.USER_AGENT, "agent")
                .body(transactionMono, String.class).exchange().block();
    }

    private static String convert(Map<String, String> map) throws UnsupportedEncodingException {
        String result = map.entrySet().stream().map(e -> encode(e.getKey()) + "=" + encode(e.getValue()))
                .collect(Collectors.joining("&"));
        return result;
    }

    private static String encode(String s) {
        try {
            return URLEncoder.encode(s, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new IllegalStateException(e);
        }
    }

Можете ли вы дать мне несколько советов после .exchange(), как я могу получить код состояния http и все доступные тела.

1 Ответ

1 голос
/ 22 июня 2019

Из объекта ClientResponse, возвращаемого биржей, вы можете использовать response.statusCode (), чтобы получить статус, и использовать response.bodyToMono () или bodyToFlux (), чтобы получить фактическое тело. Вам следует избегать использования .block () в реактивном программировании и использовать .subscribe () или .flatMap () или другие операторы для получения данных из объектов Mono или Flux. Подробнее о реактивном программировании и Проектном реакторе (используется Spring Webflux) здесь.

Например:

public Mono<Data> execute(NotificationMessage nm)
    return client.post().uri(builder -> builder.build())
                .header(HttpHeaders.USER_AGENT, "agent")
                .body(transactionMono, String.class).exchange()
                .flatMap(response -> {
                        HttpStatus code = response.statusCode();
                        Data data = response.bodyToMono(Data.class);
                        return data;
                });
}
...