我正在使用Jersey(1.18)为我的WebApplication构建REST API。在我的部分代码中,我有以下代码段。
return Response.status(Status.NO_CONTENT).entity(err_message).build();
其中Status
是com.sun.jersey.api.client.ClientResponse.Status;
根据泽西岛文档NO_CONTENT
应该返回 204 代码,而不是这样,http响应的标题包含 200 代码。
NO_CONTENT
public static final ClientResponse.Status NO_CONTENT
204 No Content,请参阅HTTP / 1.1文档。
我尝试将上述代码更改为
return Response.noContent().entity(err_message).build();
但问题仍然存在。
作为旁注,使用NOT_FOUND
代替NO_CONTENT
,按预期返回 404 标头。
关于'如何返回204代码?'的任何建议,这是一个错误,或者我做错了什么。
的副本答案 0 :(得分:7)
请参阅this SO answer,
... 204表示"没有内容",表示响应包含否 实体,但你把它放在其中。泽西岛很可能正在改变它 到你的200,这基本上与204相同,除了它 包含一个响应实体。
最后,您可以通过几个内置功能轻松获得204个响应 behavior:void方法和null返回值都映射到204 响应。否则,只需返回
Response.status(204).build()
。
换句话说,如果你想要" NO_CONTENT"然后不要在回复中包含内容。
答案 1 :(得分:3)
经过多挖掘后,我发现了问题。 W3c Documentation给出了提示。
我在引用
10.2.5 204无内容
服务器已完成请求但不需要返回实体主体,并且可能希望返回更新的元信息。响应可以包括实体标题形式的新的或更新的元信息,如果存在,应该与所请求的变体相关联。
如果客户端是用户代理,则它不应该从导致请求发送的文档视图中更改其文档视图。此响应主要是为了允许在不导致更改用户代理的活动文档视图的情况下进行操作的输入,尽管任何新的或更新的元信息应该应用于当前在用户代理的活动视图中的文档。
204响应绝不能包含消息体,因此总是在头字段后面的第一个空行终止。
在我的代码中,我entity(err_message)
会导致问题。通过删除它,正确返回 204 。我认为泽西岛或“某人”的回应是 200 ,因为它有内容。
更新(02/05/2015)
此blog post链接(今天早些时候作为答案发布,然后删除),提供了一些有关情况的其他见解。根据博客文章的内容,只要HTTP响应中有任何内容,就会调用以下方法。此方法将状态代码设置回200.
private void commitWrite() throws IOException {
if (!isCommitted) {
if (getStatus() == 204)
setStatus(200);
isCommitted = true;
o = responseWriter.writeStatusAndHeaders(size, ContainerResponse.this);
}
}
我们可以说Jersey检测到由于响应中有一些内容,状态代码被错误地设置为204并将其更改为适当的200.