3

我有一个 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();
}
4

2 回答 2

2

您不应该返回 404。只需返回一个空 JSON,您的客户端就可以处理它。

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

这种方法也用于 Facebook:

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

编辑:

我会更好地解释它。正如 W3C所说,如果应该使用 404

服务器未找到任何与请求 URI 匹配的内容。

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

当服务器不希望确切地揭示请求被拒绝的原因或没有其他响应适用时,通常使用此状态代码。

如果需要,您可以应用另一种响应。

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

if(statusCode==404) { blablabla }

编辑2:

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

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

有关此的更多来源:

RESTful API 是否应该为对象数组返回 404?

也在这里:

REST 资源 url 中的查询字符串

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

和这里一样:

REST:映射 404 HTTP 状态代码 ,尤其是注释:

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

于 2012-10-03T14:08:48.453 回答
0

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

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

于 2014-02-21T14:30:50.773 回答