Hal*_*lex 43 rest jax-rs java-ee-web-profile
我正在构建一个REST API.我的问题是,在使用Jersey时,我的服务构建和返回Response对象或返回bean或集合之间有什么区别.我只关心成功的电话,我正在为错误和特殊情况抛出适当的例外.
这是一个例子:
@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
List<FooBean> results = bar.search(foo);
return Response.ok(results).build();
}
Run Code Online (Sandbox Code Playgroud)
与
@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
List<FooBean> results = bar.search(foo);
return results;
}
Run Code Online (Sandbox Code Playgroud)
我已经看过两个例子,我更喜欢第二种情况,只是为了更容易识别服务方法.我已经检查了对这两种方法的反应,看起来它们是相同的.
思考?
Per*_*ion 39
JAX-RS规范解释了这些差异:
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状态代码.需要使用响应提供其他元数据的方法应返回Response实例,ResponseBuilder类提供了使用构建器模式创建Response实例的便捷方法.
'Regular'bean以几乎相同的方式映射Response,除了a Response允许您设置其他元数据(响应头,专用状态,专用内容类型等).至于哪一个使用,完全取决于你自己决定 - Response给你更多的灵活性,但常规豆更"自我记录".
如果你想总是返回响应200 - OK,捕获并操纵在方法返回结果之前可能发生的所有异常,并且有拦截或者,则没有区别WebApplicationException.因此,这两种方法都会产生相同的响应.
唯一的区别在于特定的场景,比如返回null对象或创建对象,如下例所示:
@POST
@Consumes("application/json")
public Response post(String content) {
URI createdUri = ...
Object createdContent = create(content);
return Response.created(createdUri).entity(createdContent).build();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,返回将是201 - CREATED(使用URI访问创建的对象)
那么,以下方法:
@POST
@Consumes("application/json")
public Object post(String content) {
URI createdUri = ...
Object createdContent = create(content);
return createdContent;
}
Run Code Online (Sandbox Code Playgroud)
......将返回回复 200 - OK
如果您不关心客户端将收到哪种响应状态,则可以毫无问题地使用任何声明.
来源:泽西岛.
| 归档时间: |
|
| 查看次数: |
32706 次 |
| 最近记录: |