我有一个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();
}
答案 0 :(得分:2)
你不应该返回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
“如果网址返回搜索结果,则不应返回404。”
同样在这里:
REST: Mapping 404 HTTP Status codes 特别是评论:
简单地说,“无结果”是有效的搜索结果。资源存在, 它的表现形式简直就是“空洞”。所以,404是不合理的。
答案 1 :(得分:0)
404 Not Found
是一个客户端错误,意味着客户端的问题是请求不存在的页面。在这种情况下,返回404是有意义的。
我认为客户端应该能够正确处理404响应。您作为服务器正在通过返回错误代码进行尽职调查。客户端能够处理响应。