我想实现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状态代码和所有可用的正文。
答案 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;
});
}