如何在RESTful Web服务中使用jersey框架抛出HTTP 204状态代码?
我正在使用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
做的那样。 其他状态代码正在rest客户端工具上正确显示,但何时显示204
状态代码,它显示200 OK
状态代码。
有人可以帮帮我吗? 我错过了什么?
首先,204在响应代码的“成功”类别中,因此作为exception的结果返回它是非常非常奇怪的事情。
其次,204表示“无内容”,这意味着响应不包含任何实体,但您在其中放置了一个实体。 泽西岛很可能会把它换成200,除了它包含一个响应实体之外,它基本上与204相同。
最后,您可以通过几个内置行为非常简单地获得204个响应:void方法和null返回值都映射到204响应。 否则,只需返回Response.status(204).build()
。
如果你想抛出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(); }
添加到现有的响应中只需添加一件事。 泽西岛正在做的是规范的正确行为 :
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状态代码。
[…]
由于您使用的是exception,因此以下部分适用(强调我的):
3.3.4例外情况
资源方法,子资源方法或子资源定位器可以抛出任何已检查或未检查的exception。 实现必须捕获所有exception并按如下方式处理它们:
- WebApplicationException的实例必须映射到响应,如下所示。 如果exception的响应属性不包含实体,并且exception映射提供程序(请参阅第4.4节)可用于WebApplicationException,则实现必须使用提供程序创建新的Response实例, 否则直接使用response属性。 然后根据第3.3.3节处理生成的Response实例。
[…]
所以你应该返回null,void或者建立一个204响应。 只有在应用程序中出现exception情况并抛出exception时才会抛出exception。