获取http响应代码和所有可用的正文

时间:2019-06-21 10:42:25

标签: java spring spring-boot spring-mvc spring-webflux

我想实现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 个答案:

答案 0 :(得分:1)

从交换返回的ClientResponse对象中,可以使用response.statusCode()获取状态,并使用response.bodyToMono()或bodyToFlux()获取实际主体。您应该避免在反应式编程中使用.block(),而应使用.subscribe()或.flatMap()或其他运算符从Mono或Flux对象获取数据。 Read more关于反应式编程和Project Reactor(由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;
                });
}