【问题标题】:HTML response when JAX-RS response is 404JAX-RS 响应为 404 时的 HTML 响应
【发布时间】:2014-02-21 22:30:50
【问题描述】:

我有一个 JAX-RS 资源类,它可以在发出某个请求时返回 404 响应。不幸的是,即使操作的方法被注释为@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }),404 响应对象总是会导致 Tomcat 将自己的“未找到”HTML 错误页面推到正文中。

这会破坏期望 XML/JSON 响应的客户端。在这些情况下如何关闭 Tomcat?

我的代码现在看起来像这样:

@GET
@Path("isbn/{isbn}")
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
public Response isbn(@PathParam("isbn") String isbn) {

    ProductSearchDO productSearch = ProductSvc.find( isbn );
    if (productSearch == null)
        return Responses.notFound().build();

    return Response.ok( productSearch ).tag( String.valueOf( productSearch.hashCode() ) ).build();
}

【问题讨论】:

    标签: tomcat http-status-code-404 jax-rs


    【解决方案1】:

    您不应该返回 404。只需返回一个空 JSON,然后您的客户端将能够处理它。

    这种方法称为“软 404”(如果我没记错的话)。

    这种方法也用于 Facebook:

    https://graph.facebook.com/search?q=nlknrekjfndjkfnsjkefbnejkrbfjedbfjekfbekj

    编辑:

    我会解释得更好。由于 W3C says 应该使用 404

    服务器没有找到任何匹配 Request-URI 的东西。

    实际上,您的服务器已经找到了一个匹配的 Request-URI,但只是响应为空。还有

    此状态码通常在服务器不希望确切说明请求被拒绝的原因时使用,或者当没有其他响应适用时

    如果需要,您可以应用其他类型的响应。

    如果您仍然想按自己的方式进行操作,可以尝试用空页面覆盖标准 Tomcat 404 页面,或要求客户端检查状态码

    if(statusCode==404) { blablabla }
    

    EDIT2:

    反对什么?我不认为我的回答是错误的,你可以喜欢或不喜欢,但我不认为它实际上是错误的。

    在您的情况下,您正在对某个产品进行研究。如果您找不到任何与您的搜索匹配的产品,为什么要返回 404?

    有关此的更多来源:

    Should a RESTful API return 404 for arrays of objects?

    也在这里:

    Querystring in REST Resource url

    “如果 URL 返回搜索结果,则不应返回 404。”

    这里也一样:

    REST: Mapping 404 HTTP Status codes 特别是评论:

    简单地说,“无结果”是一个有效的搜索结果。资源存在, 它的表示只是“空的”。所以,404 是不合理的。

    【讨论】:

    • 仅仅因为你的网络服务器配置不好就给出非标准的响应是愚蠢的。
    • 你应该返回404它在服务器上找不到资源。否则状态码将毫无意义。但是状态码的存在是有原因的......
    • 阅读第二次编辑。资源找到了,只是搜索为空。所以在这种情况下 404 是没有意义的。
    • @Enrichman 所以说我们有 getUser/userId/1234 并且用户不存在...应该返回 404 还是什么? (没有空数组)。另外一个参数是 404 可以用于如果没有服务作为 getUser/userId/{userid} ....so 在调试客户端时,最好只保留 404 以防止找不到服务。这里的资源是什么意思?用户对象是资源还是 /getUSer/userId/{userId} 是资源?
    【解决方案2】:

    404 Not Found 是客户端错误,这意味着问题出在客户端请求不存在的页面上。在这种情况下,返回 404 是有意义的。

    我认为 客户端 应该能够适当地处理 404 响应。您作为服务器正在通过返回错误代码进行尽职调查。是否能够处理响应取决于客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 2016-01-10
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多