我正在建立一个REST API。 我的问题是,用球衣,我有什么服务建设和返回Response对象或返回豆或集合之间的差异时。 我只关注成功的电话,我的错误和异常情况下抛出适当的例外。
下面是一个例子:
@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
List<FooBean> results = bar.search(foo);
return Response.ok(results).build();
}
与
@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
List<FooBean> results = bar.search(foo);
return results;
}
我见过用这两个例子中,我更喜欢第二种方案中,只是为了更容易地识别服务的方法。 我检查,这两种方法的响应,他们似乎是相同的。
思考?
的差异在JAX-RS说明书中解释:
3.3.3返回类型
资源的方法可以返回void,响应,GenericEntity,或其他Java类型,这些返回类型被映射到一个响应实体体如下:
空虚
结果在一个空实体体与204个的状态代码。
响应
结果示于实体主体从与由所述响应的状态属性中指定的状态码的应答的实体属性映射。 返回null值将导致204个状态码。 如果没有设置该响应的状态属性:200个状态码被用于一个非空的实体属性和使用204个状态的代码,如果该实体属性为null。
GenericEntity
导致从GenericEntity的实体属性映射的实体主体。 如果返回值不为空使用200个状态码,空返回值导致204个状态码。
其他
结果实体主体从类返回的实例映射。 如果返回值不为空使用200个状态码,空返回值导致204个状态码。
需要提供的响应额外的元数据应该返回响应的实例方法 ,该ResponseBuilder类提供了一个方便的方式来创建使用生成器模式的响应实例。
“常规”豆映射了在几乎相同的方式, Response
是,不同之处在于一个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();
}
在这种情况下,返回将是201 - CREATED
(随着URI来访问所创建的对象)
所以,下面的方法:
@POST
@Consumes("application/json")
public Object post(String content) {
URI createdUri = ...
Object createdContent = create(content);
return createdContent;
}
...将返回响应200 - OK
如果你不关心它响应状态你的客户会收到,你可以使用任何声明没有问题。
资料来源: 新泽西州 。
我的观点的个人,如果响应包含DTO(豆的豆/集),然后休息服务始终必须返回DTO,而不是响应对象。
动机 :早或晚,你会被要求做休息服务客户端更容易,的使用提供其余客户端API。 通常情况下,你必须提取其余的接口它,并与您的REST服务实现它们。 这些休息接口由您的REST客户端的客户端使用。
和从一个客户端点有处理DTO和滑动响应之间的巨大差异。 在使用情况下的响应,您的客户端被强制:
- 检查响应代码明确地处理全成响应
- 错误处理,通过显式检查代码
- 由他本人将您回应的身体进入DTO。
这意味着处理响应是非常相似的方法,这被认为是一个非常不好的做法,返回错误代码。 为了在一个地方来处理错误,异常使用(我不是在谈论手柄错误的FP的方式,这是最好的)。
所以你可以这样做:
- 在情况下,请求被成功处理,转换成你的休息业务数据到DTO /豆和返回。
- 在情况下,如果验证失败,还是出事了,扔在你休息的服务异常。 也许一个默认的异常映射器是不适合你,所以,你必须实现自己的异常映射。
所以,如果提前思考,你应该返回DTO。
一个用例,平扫时响应应退还 - 当您导出文件,例如。 这似乎JAX RS不允许返回InputStream对象。 不知道,它必须进行检查。
其他用途的情况下,被@Perception指出,但它更多的是一个例外,不是规则:
需要提供的响应额外的元数据应该返回响应的实例方法,该ResponseBuilder类提供了一个方便的方式来创建使用生成器模式的响应实例。
注:这是JAX RS一个一般性的问题,不依赖于具体实现,像RestEasy的或泽西
文章来源: In JAX RS, differences between returning Response and Bean or Collection of Beans (DTO)