16

我正在使用 jersey 框架来开发 RESTful Web 服务。我使用以下代码响应各种 HTTP 状态代码:

public class RestNoContentException extends WebApplicationException 
{
    public RestNoContentException(String message) 
    {
        super(Response.status(Status.NO_CONTENT)
            .entity(message).type("text/plain")
            .build());
        }
}

使用 Firefox Mozilla REST 客户端工具测试 REST Web 服务时,它显示的是200 OK状态而不是204 NO CONTENT. 我正在以与处理状态代码相同的方式处理其他状态代码204。其他状态代码在休息客户端工具上正确显示,但是当显示204状态代码时,它正在显示200 OK状态代码。

有人可以帮我吗?我错过了什么?

4

3 回答 3

20

首先,204 属于响应代码的“成功”类别,因此将其作为异常结果返回是一件非常非常奇怪的事情。

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

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

于 2013-01-01T04:58:34.187 回答
13

You shouldn't give entity if you want throw 204:

@GET
@Produces(MediaType.TEXT_PLAIN)
public Response test() {
    //return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200
    return Response.status(Status.NO_CONTENT).build();
}
于 2013-01-01T02:21:04.160 回答
9

只需添加到现有响应中的一件事。泽西正在做的是规范的正确行为

3.3.3 返回类型

资源方法可以返回 void、Response、GenericEntity 或其他 Java 类型,这些返回类型映射到响应实体主体,如下所示:

void产生一个带有 204 状态代码的空实体主体。

响应生成从响应的实体属性映射的实体主体,其状态代码由响应的状态属性指定。空返回值导致 204 状态代码。如果未设置 Response 的状态属性:非空实体属性使用 200 状态码,如果实体属性为空,则使用 204 状态码。

GenericEntity生成从 GenericEntity 的 Entity 属性映射的实体主体。如果返回值不为空,则使用 200 状态代码,空返回值将导致 204 状态代码。

从返回的实例的类映射的实体主体中的其他结果。如果返回值不为空,则使用 200 状态代码,空返回值将导致 204 状态代码。

[...]

由于您使用的是异常,因此以下部分适用(强调我的):

3.3.4 例外情况

资源方法、子资源方法或子资源定位器可能会抛出任何已检查或未检查的异常。实现必须捕获所有异常并按如下方式处理它们:

  1. WebApplicationException 的实例必须按如下方式映射到响应。如果异常的响应属性不包含实体并且异常映射提供者(参见第 4.4 节)可用于 WebApplicationException,则实现必须使用提供者创建新的响应实例,否则直接使用响应属性。然后根据第 3.3.3 节处理生成的 Response 实例。

[...]

因此,您应该返回 null、void 或构建 204 响应。只有当它是您的应用程序中的例外情况时,您才抛出异常,并且抛出异常可以明确这一点

于 2013-01-04T13:08:26.940 回答