Ash*_*nse 16 java rest web-services jax-rs jersey
我正在使用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());
}
}
Run Code Online (Sandbox Code Playgroud)
在使用Firefox Mozilla rest客户端工具测试REST Web服务时,它显示200 OK状态而不是204 NO CONTENT.我正在处理其他状态代码,就像我为状态代码做的那样204.其他状态代码正在rest客户端工具上正确显示204,但何时显示状态代码,它显示200 OK状态代码.
有人可以帮帮我吗?我错过了什么?
Rya*_*art 20
首先,204在响应代码的"成功"类别中,因此作为异常的结果返回它是非常非常奇怪的事情.
其次,204表示"无内容",这意味着响应不包含任何实体,但您在其中放置了一个实体.泽西岛很可能会把它换成200,除了包含响应实体之外,它基本上与204相同.
最后,您可以通过几个内置行为非常简单地获得204个响应:void方法和null返回值都映射到204响应.否则,只需返回Response.status(204).build().
sec*_*ing 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();
}
Run Code Online (Sandbox Code Playgroud)
添加到现有响应中只需添加一件事.泽西岛正在做的是规范的正确行为:
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,则实现必须使用提供程序创建新的Response实例,否则直接使用response属性.然后根据第3.3.3节处理生成的Response实例.
[...]
所以你应该返回null,void或者建立一个204响应.你抛出异常,只有当它在你的应用程序中的例外情况,并抛出异常了这一点.
| 归档时间: |
|
| 查看次数: |
18617 次 |
| 最近记录: |