当前位置: 首页 > 知识库问答 >
问题:

基于响应体的Spring WebClient抛出错误

鄢修德
2023-03-14

我正在使用SpringWebClient调用RESTAPI。我想根据响应抛出一个错误。例如,如果主体存在错误(400)

{"error": "error message1 "}

然后我想抛出一个带有“error message1”的错误。如果主体出现错误(400),则采用相同的方法

{"error_code": "100020"}

然后我想抛出一个错误,错误为\u cde 100020。我想用一种非阻塞的方式来做。

public Mono<Response> webclient1(...) {

 webClient.post().uri(createUserUri).header(CONTENT_TYPE, APPLICATION_JSON)
                .body(Mono.just(request), Request.class).retrieve()
                .onStatus(HttpStatus::isError, clientResponse -> {
        
                 //Error Handling
                
                }).bodyToMono(Response.class);
}

共有1个答案

俞新翰
2023-03-14

ClientResponse中的主体应该以反应式方式提取(javadoc),而onStatus方法中的lambda应该返回另一个Mono(javadoc)。综上所述,看看下面的例子

onStatus(HttpStatus::isError, response -> response
    .bodyToMono(Map.class)
    .flatMap(body -> {
        var message = body.toString(); // here you should probably use some JSON mapper
        return Mono.error(new Exception(message));
    })
);
 类似资料:
  • HTTP 响应报文分为三个部分: 响应行 响应头 响应体 对于 HTTP 响应体的输出,在 OpenResty 中调用 ngx.say 或 ngx.print 即可。经过查看官方 wiki ,这两者都是输出响应体,区别是 ngx.say 会对输出响应体多输出一个 \n 。如果你用的是浏览器完成的功能调试,使用这两着是没有区别的。但是如果使用各种终端工具,这时候使用 ngx.say 明显就更方便了。

  • 问题内容: 我真的很难站起来从html页面到我的node.js应用程序然后再回到html页面的双向数据传输。 我很确定我已经找到了正确的解决方案,但是我只是没有使它起作用。 我在node.js应用程序中使用了以下内容: 以下是我的html页面: 因此,当我运行节点应用程序时,服务器运行正常。当我启动html页面时,收到警报“在这里!”。当我按下按钮“ NameGameIt”时,我收到警报“现在怎么

  • 我已经定义了: 在filter方法中,我记录了响应,但我还想添加执行请求的。我知道我可以在请求之前访问这些数据(使用),但有没有办法将这些数据添加到我的过滤器?

  • 我正在尝试使用Web客户端创建REST调用 我只想记录通话结果。成功时 - 使用响应正文记录成功消息,在 5XX 或超时或其他时 - 记录错误消息。日志应该在后台创建(而不是由创建调用的线程创建)但是每次都会执行,工作正常,但也有 记录在日志文件中。 我也在一些教程中看到过方法,但在我的设置中有这样的方法。 如何记录成功和失败消息?

  • 我想在java中对API的HTTP响应实现重试框架。 如果回答是: 400:将json中的参数设为null,然后重试 202:返回成功 429:请等待2分钟,然后重试 5XX:等待5分钟,然后重试 如果重试次数超过,则抛出异常。是否有任何可用的库支持重试响应类型并允许编辑请求对象?如果没有,我怎么能设计一个?有没有围绕它的教程?

  • 所以,我现在正在学习如何使用vertx,并尝试在get请求中提供html文件。当我在本地主机上实际执行请求时,它会为文件提供服务,但在控制台中,我得到了错误: IllegalStateException:响应已经写入 这是我的代码: 我的文件树如下所示: 知道为什么会这样吗?谢谢