使用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字段可能是一种可能的解决方案,但我觉得这可能不是正确的方法。
答案 0 :(得分:2)
HTTP 404状态是一个有效的响应,只有当它无法找到所请求的资源时才能由正在运行的服务器返回。但是,如果服务器关闭,您的连接将被拒绝。
答案 1 :(得分:0)
正在关闭的服务器在客户端被视为I / O错误,并且RestTemplate抛出了ResourceAccessException。
ResourceAccessException - 服务器关闭。
HttpStatusCodeException - 当服务器启动并返回状态代码时(4xx -series抛出子类异常HttpClientErrorException,5xx-series抛出子类异常HttpServerErrorException)。