当返回 404 的 HttpStatus 代码时,如何区分托管资源的服务器(在 url 上)是否已关闭或资源是否不存在

How to differentiate whether the server hosting a resource(on url) is down or if the resource doesn't exist when a HttpStatus code of 404 is returned

使用 Spring 的 RestTemplate.exchange(url, HTTP.GET,String.class) 签名访问资源使用 URL 和GET Http方法,我们如何区分托管资源的服务器(由url表示)是否已关闭或服务器是否找不到资源并因此返回404的HttpStatus代码。

我想根据这个差异通过重试机制,如果资源不存在,我不会寻求重试。但我会在可配置的后退时间段后重试,希望服务器在服务器关闭时能够启动。

我在 spring 来源中提到了 HTTPStatus class,并找到了对 url - https://www.rfc-editor.org/rfc/rfc7231#section-6.5.5

的引用

6.5.4。 404 未找到 404(Not Found)状态码表示源服务器没有 找不到目标资源的当前表示或不是 愿意透露一个存在。 404 状态代码不 指出这种缺乏代表性是暂时的还是 永恒的; 410(Gone)状态码优于 404 源服务器知道,大概是通过一些可配置的方式, 这种情况很可能是永久性的。 默认情况下,404 响应是可缓存的;即,除非另有说明 由方法定义或显式缓存控制指示(请参阅 [RFC7234] 的第 4.2.2 节)。

我已通读: () and ()。但是我找不到一篇文章来帮助我区分这两种情况。

处理 HttpClientErrorException 并查看 ResponseBody 字段可能是一个可能的解决方案,但我觉得这可能不是正确的方法。

HTTP 404 状态是一个有效的响应,只能由 运行 服务器在找不到所请求的资源时返回。但是,如果服务器已关闭,您的连接将被拒绝。

服务器停机在客户端被视为 I/O 错误,RestTemplate 抛出 ResourceAccessException。

ResourceAccessException - 服务器关闭。

HttpStatusCodeException - 当服务器启动并返回状态代码时(4xx 系列抛出子类异常 HttpClientErrorException,5xx 系列抛出子类异常 HttpServerErrorException)。