gpt4 book ai didi

java - Spring WebClient - 在发生 HTTP 错误(4xx、5xx)时如何访问响应正文?

转载 作者:行者123 更新时间:2023-12-01 17:54:36 26 4
gpt4 key购买 nike

我想将异常从“数据库”REST API 重新抛出到“后端”REST API,但我丢失了原始异常的消息。

这是我通过 Postman 从“数据库”REST API 获取的内容:

{
"timestamp": "2020-03-18T15:19:14.273+0000",
"status": 400,
"error": "Bad Request",
"message": "I'm DatabaseException (0)",
"path": "/database/api/vehicle/test/0"
}

这部分没问题。

这是我通过 Postman 从“后端”REST API 获得的内容:

{
"timestamp": "2020-03-18T15:22:12.801+0000",
"status": 400,
"error": "Bad Request",
"message": "400 BAD_REQUEST \"\"; nested exception is org.springframework.web.reactive.function.client.WebClientResponseException$BadRequest: 400 Bad Request from GET http://localhost:8090/database/api/vehicle/test/0",
"path": "/backend/api/vehicle/test/0"
}

正如您所看到的,原始的“消息”字段丢失了。

我使用:

  • Spring 启动 2.2.5.RELEASE
  • spring-boot-starter-web
  • spring-boot-starter-webflux

后端和数据库从 Tomcat ( web and webflux in the same application ) 开始。

这是后端:

    @GetMapping(path = "/test/{id}")
public Mono<Integer> test(@PathVariable String id) {
return vehicleService.test(id);
}

使用vehicleService.test:

    public Mono<Integer> test(String id) {
return WebClient
.create("http://localhost:8090/database/api")
.get()
.uri("/vehicle/test/{id}", id)
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(Integer.class);
}

这是数据库:

    @GetMapping(path = "/test/{id}")
public Mono<Integer> test(@PathVariable String id) throws Exception {

if (id.equals("0")) {
throw new DatabaseException("I'm DatabaseException (0)");
}

return Mono.just(Integer.valueOf(2));
}

我还尝试了 return Mono.error(new DatabaseException("I'm DatabaseException (0)"));

和数据库异常:

public class DatabaseException extends ResponseStatusException {

private static final long serialVersionUID = 1L;

public DatabaseException(String message) {
super(HttpStatus.BAD_REQUEST, message);

}
}

看来我的后端转换了响应,并且在互联网上找不到任何答案。

最佳答案

您可以使用 exchange 代替 WebClientretrieve,它可以让您处理错误并使用从以下位置检索的消息传播自定义异常服务响应。

private void execute()
{
WebClient webClient = WebClient.create();

webClient.get()
.uri("http://localhost:8089")
.exchangeToMono(this::handleResponse)
.doOnNext(System.out::println)
.block(); // not required, just for testing purposes
}

private Mono<Response> handleResponse(ClientResponse clientResponse)
{
if (clientResponse.statusCode().isError())
{
return clientResponse.bodyToMono(Response.class)
.flatMap(response -> Mono.error(new RuntimeException(response.message)));
}

return clientResponse.bodyToMono(Response.class);
}

private static class Response
{
private String message;

public Response()
{
}

public String getMessage()
{
return message;
}

public void setMessage(String message)
{
this.message = message;
}

@Override
public String toString()
{
return "Response{" +
"message='" + message + '\'' +
'}';
}
}

关于java - Spring WebClient - 在发生 HTTP 错误(4xx、5xx)时如何访问响应正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com