java – 在WebFlux WebClient中测试状态代码时如何获取响应体?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在WebFlux WebClient中测试状态代码时如何获取响应体?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1985字,纯文字阅读大概需要3分钟。
内容图文
![java – 在WebFlux WebClient中测试状态代码时如何获取响应体?](/upload/InfoBanner/zyjiaocheng/822/33d719e106b049e6a4adf64e6c3d8450.jpg)
在尝试根据返回的状态代码抛出异常时,如何检索响应主体?例如,假设我想抛出异常并拒绝HTTP 201.
client.post().exchange().doOnSuccess(response -> {
if (response.statusCode().value() == 201) {
throw new RuntimeException();
}
}
如何使用响应的主体填充异常,以便我可以抛出详细的WebClientResponseException?
我应该使用不同的方法来测试响应状态代码吗?
编辑:我试图在使用exchange()时复制以下功能.
client.get()
.retrieve()
.onStatus(s -> !HttpStatus.CREATED.equals(s),
MyClass::createResponseException);
//MyClass
public static Mono<WebClientResponseException> createResponseException(ClientResponse response) {
return response.body(BodyExtractors.toDataBuffers())
.reduce(DataBuffer::write)
.map(dataBuffer -> {
byte[] bytes = new byte[dataBuffer.readableByteCount()];
dataBuffer.read(bytes);
DataBufferUtils.release(dataBuffer);
return bytes;
})
.defaultIfEmpty(new byte[0])
.map(bodyBytes -> {
String msg = String.format("ClientResponse has erroneous status code: %d %s", response.statusCode().value(),
response.statusCode().getReasonPhrase());
Charset charset = response.headers().contentType()
.map(MimeType::getCharset)
.orElse(StandardCharsets.ISO_8859_1);
return new WebClientResponseException(msg,
response.statusCode().value(),
response.statusCode().getReasonPhrase(),
response.headers().asHttpHeaders(),
bodyBytes,
charset
);
});
}
解决方法:
doOn **运算符是副作用运算符,例如,应该用于记录目的.
在这里,您希望在管道级别实现该行为,因此onStatus更适合这里:
Mono<ClientHttpResponse> clientResponse = client.post().uri("/resource")
.retrieve()
.onStatus(httpStatus -> HttpStatus.CREATED.equals(httpStatus),
response -> response.bodyToMono(String.class).map(body -> new MyException(body)))
bodyToXYZ(...);
要么
Mono<ResponseEntity<String>> result = client.post().uri("/resource")
.exchange()
.flatMap(response -> response.toEntity(String.class))
.flatMap(entity -> {
// return Mono.just(entity) or Mono.error() depending on the response
});
请注意,如果您期望大型响应主体,获取整个响应主体可能不是一个好主意;在这种情况下,你将在内存中缓存大量数据.
内容总结
以上是互联网集市为您收集整理的java – 在WebFlux WebClient中测试状态代码时如何获取响应体?全部内容,希望文章能够帮你解决java – 在WebFlux WebClient中测试状态代码时如何获取响应体?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。