6

我正在使用 Jersey (1.18) 为我的 WebApplication 构建一个 REST API。在我的代码的一部分中,我有以下代码段。

return Response.status(Status.NO_CONTENT).entity(err_message).build();

Status的一个实例在哪里com.sun.jersey.api.client.ClientResponse.Status;

根据 Jersey DocumentationNO_CONTENT应该返回一个204代码,而不是这个,http 响应有一个带有200代码的标头。

NO_CONTENT
public static final ClientResponse.Status NO_CONTENT
204 无内容,参见 HTTP/1.1 文档。

我试图将上述代码更改为

return Response.noContent().entity(err_message).build();

但问题仍然存在。作为旁注,使用NOT_FOUND而不是,按预期NO_CONTENT返回404标头。

关于“如何返回 204 代码?”的任何建议,这是一个错误还是我做错了什么。

注意:不是返回 200 响应代码而不是 204的重复

4

2 回答 2

7

看到这个答案说,

...204 表示“无内容”,表示响应不包含实体,但您在其中放入了一个实体。Jersey 很可能会为您将其切换为 200,这与 204 基本相同,只是它包含一个响应实体。

最后,您可以通过几个内置行为非常简单地获得 204 响应:void 方法和 null 返回值都映射到 204 响应。否则,只需 return Response.status(204).build()

换句话说,如果您想要“NO_CONTENT”,则不要在您的回复中包含内容。

于 2015-07-27T14:19:40.540 回答
3

经过多一点挖掘,我发现了问题。W3c 文档给出了提示。

我在引用

10.2.5 204 无内容

服务器已完成请求,但不需要返回实体主体,并且可能希望返回更新的元信息。响应可能包括实体头形式的新的或更新的元信息,如果存在,应该与请求的变体相关联。

如果客户端是用户代理,它不应该改变导致请求被发送的文档视图。这个响应主要是为了允许输入动作发生而不改变用户代理的活动文档视图,尽管任何新的或更新的元信息应该应用于当前在用户代理的活动视图中的文档。

204 响应不能包含消息体,因此总是由头字段之后的第一个空行终止。

在我的代码中,我有entity(err_message) 导致问题的原因。通过删除它,204被正确返回。我认为泽西岛或“某人”以某种方式将响应投射到200,因为它有内容。

更新 (02/05/2015)

这个博客文章链接(今天早些时候作为答案发布,然后被删除)提供了一些关于情况的额外见解。根据博文的内容,只要 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。

于 2015-07-27T14:21:14.747 回答