ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 在WebFlux WebClient中测试状态代码时如何获取响应体?

2019-05-22 19:50:33  阅读:479  来源: 互联网

标签:java spring-webflux


在尝试根据返回的状态代码抛出异常时,如何检索响应主体?例如,假设我想抛出异常并拒绝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,spring-webflux
来源: https://codeday.me/bug/20190522/1153595.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有