【问题标题】:Jersey 'NoContent' response returns 200 instead of 204Jersey 'NoContent' 响应返回 200 而不是 204
【发布时间】:2015-07-27 14:12:02
【问题描述】:

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

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

其中Statuscom.sun.jersey.api.client.ClientResponse.Status; 的一个实例

根据 Jersey 文档 NO_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 代码?”的任何建议,这是一个错误还是我做错了什么。

注意:不是Returning 200 response code instead of 204的重复项

【问题讨论】:

    标签: java rest jersey-1.0


    【解决方案1】:

    请参阅this SO answer,其中说,

    ...204 表示“无内容”,表示响应不包含 实体,但你在里面放了一个。泽西岛很可能正在改变它 给你一个 200,它与 204 基本相同,除了它 包含响应实体。

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

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

    【讨论】:

    • 打我一分钟!感谢您的快速回答。我也得出了同样的结论
    【解决方案2】:

    经过一番挖掘,我发现了问题所在。 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。

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2014-01-12
      • 2022-10-20
      • 2020-02-16
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多