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

时间:2017-04-26 20:20:35

标签: java rest spring-mvc http-status-code-404 spring-rest

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

我想基于这种差异的重试机制,如果资源不存在,我不打算重试。但是我会在一个可配置的退避时间段后重试,希望服务器在服务器关闭时启动。

我在spring源代码中引用了HTTPStatus类,发现了对url的引用 - http://tools.ietf.org/html/rfc7231#section-6.5.5

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

我已阅读:(Is 404 the right return code for a resource that currently doesn't exist?)和(What to return when a route/url is found but not the resource behind it?)。但我找不到一篇文章来帮助我区分这两种情况。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

正在关闭的服务器在客户端被视为I / O错误,并且RestTemplate抛出了ResourceAccessException。

ResourceAccessException - 服务器关闭。

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