【问题标题】:Spring Boot can't read some API responsesSpring Boot 无法读取某些 API 响应
【发布时间】:2021-05-02 11:53:35
【问题描述】:

我正在使用 Spring Boot 来使用 API。对于某些 API,它可以工作,但对于其他一些 API,它无法返回 500 Internal Server Error。例如,当使用此 API https://quoters.apps.pcfone.io/api/random 时,它可以工作,但 https://reqres.in/api/unknown/23 返回 500 错误。这是什么原因造成的?

我的代码很简单:

restTemplate.getForEntity("https://reqres.in/api/unknown/23", String.class)

【问题讨论】:

  • 这意味着regres.in 的服务器出现内部错误...您需要调试该服务器或至少查看日志
  • 确保 URL 应该启动并运行“reqres.in”。
  • 如果我尝试它,我会得到 404(这是应该发生的)。如果你得到 500,那么很可能你有额外的代码,这会改变行为。如果是这种情况,请添加这些详细信息。

标签: java spring spring-boot rest


【解决方案1】:

对导致错误的 URL 的请求以 404 Not Found 状态代码响应。请检查服务器是否在给定端点上提供服务。

至于500 Internal Server Error,发生的情况是,在从服务器接收到 404 后,您的RestTemplate 正在抛出一个RestClientException,它正在转换为状态码为:500 的响应。您可以添加使用@ControllerAdvice 对此进行显式处理,这将使您能够更好地控制响应状态。

这是 Spring 中 ControllerAdvice 的参考:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

【讨论】:

  • 您是否尝试在浏览器中访问reqres.in/api/unknown/23?您将看到该链接是可访问的。
  • 没错,该链接是可以访问的,但是如果您在浏览器上打开开发者控制台,您将能够在网络选项卡中看到请求的响应代码,在这种情况下是 404。发送 404 响应的服务器可以发送响应正文,这就是您在屏幕上看到的内容,但从客户端的角度来看,404 响应代码仍然是一个错误,这就是 RestTemplate 的解释方式。跨度>
  • 好的,我明白了。这对于 Spring Boot 来说是一种奇怪的工作方式。有没有更简单的方法可以返回真实的状态码?
  • 如果您使用的是 RestTemplate,它可能需要一些显式处理。我只是快速浏览了 RestTemplate 提供的方法的规范,几乎每个方法都必然会抛出一个您必须处理的 RestClientException。同时处理这些异常可能不是一个坏主意,因为如果您在向上游服务器请求时充当网关,则在发生错误时您的响应状态可能与服务器不同。例如,如果服务器为您提供 500 ISE,您作为网关可能希望向您的客户端返回 502 Bad Gateway 错误
  • 这里是 Rest Template 规范的链接:docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
猜你喜欢
  • 2020-06-21
  • 2018-12-05
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2021-11-23
  • 2015-04-20
相关资源
最近更新 更多