小编cha*_*lau的帖子

WebClient 的 bodyToMono 对 Empty Body 预期行为

当 WebClient bodyToMono 遇到空体时,预期的行为是什么?在我的具体示例中,我们正在检查从 post 调用返回的状态,如果是错误,则将其转换为我们的自定义错误格式。如果转换为自定义错误格式失败,我们会在自定义格式中创建一个新错误,说明这一点。但是当一个响应出现时,它是一个空体的错误,它根本没有发送任何错误,因为 bodyToMono 没有像我预期的那样失败。请参阅以下代码块:

.retrieve()
.onStatus(HttpStatus::isError) { response ->
    response.bodyToMono(ErrorResponse::class.java)
        .doOnError {
            throw APIException(
                code = UNEXPECTED_RESPONSE_CODE,
                reason = it.message ?: "Could not parse error response from Inventory Availability",
                httpStatus = response.statusCode()
            )
        }
        .map {
            throw APIException(
                reason = it.errors.reason,
                code = it.errors.code,
                httpStatus = response.statusCode()
            )
        }
}
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们添加了 switchIfEmpty。

.retrieve()
.onStatus(HttpStatus::isError) { response ->
    response.bodyToMono(ErrorResponse::class.java)
        .switchIfEmpty { throw RuntimeException("Received Empty Response Body") }
        .doOnError {
            throw APIException(
                code = UNEXPECTED_RESPONSE_CODE,
                reason = it.message …
Run Code Online (Sandbox Code Playgroud)

error-handling kotlin spring-boot spring-webflux spring-webclient

7
推荐指数
1
解决办法
6439
查看次数