【发布时间】:2016-07-06 10:11:06
【问题描述】:
我正在使用 Jax-RS Jersey 开发简单的 API。假设我正在考虑某个国家/地区商店销售的商品的域。
我的设计包括这两个调用:
- /webapi/items
- /webapi/store/1/items
他们都应该返回一个物品清单,第一个应该返回在那个国家销售的所有物品,第二个应该只返回商店编号 1 销售的物品。
我当然有两个资源,一个处理所有关于商品的请求的 ItemResource,以及一个处理所有关于商店的请求的 StoreResource。
@Path("items")
class ItemResource {
@GET
public List<Item> getAllItems(){
}
.
@Path("stores")
class StoreResource
@GET
@Path("/{storeId}/items")
public List<Item> getItemsSoldByStore(@PathParam("storeId") long storeId) {
}
我想做的是将第二个请求传递给 ItemResource,以避免 StoreResource 和模型类 Item 或专门为管理项目而创建的数据库接口(如 DAO)之间的耦合。
我知道我可以将 ItemResource 视为子资源或 StoreResource 的嵌套资源,但关键是这并不总是正确的,因为有时我想在不传递商店 ID 的情况下调用 ItemResource 来获取所有项目(这是第一个请求 http://foo.com/webapi/items 的情况。
我想在 ItemResource 上保留 @Path("items") 注释,以便它处理对 /items 端点的每个请求。
在这种情况下正确的设计是什么?感谢您的帮助。
【问题讨论】:
-
我不知道这是否是最好的做法,但您仍然可以在类注释中放置任何内容(例如
@Path("/"))并将"/item"和"/stores..."添加到您的函数中注释,但在这种情况下,所有请求都将被重定向到同一个类。 -
感谢您的回答。我认为这是一种非常常见的情况,所以我想知道我是否遗漏了一些关于设计的重要内容。使用注解@Path("items") 创建非嵌套资源和使用注解@Path("/") 创建嵌套资源怎么样?
-
但在这种情况下,“foo.com/webapi/stores...”不会被您的资源捕获,因为根路径是“items”。
标签: rest jersey jax-rs nested-resources