我正在使用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
状态代码。
有人可以帮帮我吗?我错过了什么?
答案 0 :(得分:19)
首先,204在响应代码的“成功”类别中,因此将其作为异常的结果返回是一件非常非常奇怪的事情。
其次,204表示“无内容”,这意味着响应中不包含任何实体,但您将其中的一个放入其中。泽西岛很可能会把它换成200,除了它包含一个响应实体之外,它基本上与204相同。
最后,您可以通过几个内置行为非常简单地获得204个响应:void方法和null返回值都映射到204响应。否则,只需返回Response.status(204).build()
。
答案 1 :(得分:12)
如果你想抛出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();
}
答案 2 :(得分:8)
添加到现有的回复中只需添加一件事。泽西岛正在做的是correct behavior as for the spec:
3.3.3返回类型
资源方法可以返回void,Response,GenericEntity或其他Java类型,这些返回类型映射到响应实体主体,如下所示:
void 导致具有204状态代码的空实体主体。
响应从Response的实体属性映射的实体主体中的结果,其中状态代码由Response的status属性指定。空返回值将生成204状态代码。 如果未设置Response的status属性:200状态代码用于非null实体属性,如果entity属性为null,则使用204状态代码。
GenericEntity 从GenericEntity的Entity属性映射的实体主体中的结果。如果返回值不为null,则使用200状态代码,空返回值将生成204状态代码。
其他从返回实例的类映射的实体主体中的结果。如果返回值不为null,则使用200状态代码,空返回值将生成204状态代码。
[...]
由于您正在使用例外,以下部分适用(强调我的):
3.3.4例外
资源方法,子资源方法或子资源定位器可以抛出任何已检查或未选中的内容 例外。实现必须捕获所有异常并按如下方式处理它们:
- WebApplicationException的实例必须映射到响应,如下所示。如果 异常的response属性不包含实体和异常映射提供程序 (参见4.4节)可用于WebApplicationException,实现必须使用 provider创建一个新的Response实例,否则直接使用response属性。该 然后根据第3.3.3节处理生成的响应实例。
醇>[...]
所以你应该返回null,void或者建立一个204响应。只有在应用程序中出现异常情况并抛出异常makes this clear时,才会抛出异常。