以相互方式交织泽西岛的资源
Intertwining resources in Jersey in a mutual way
我正试图解决泽西岛的这个 RESTful 场景:我有两个资源,用户和项目,我想检索连接到某个用户和所有用户的所有项目连接到某个项目。简而言之,User和Item之间存在多对多的关系。
我遇到了这个 RESTful 设计:
- 与某个用户关联的所有项目:
GET .../users/{user_id}/items
- 连接到某个项目的所有用户:
GET .../items/{item_id}/users
我如何在 Jersey 中实现它?我找到了 this 解决方案,但它与嵌套在根资源中的子资源有关,而在我的例子中,用户和项目都是根资源,可以通过它们自己的 URI 访问。
以下应该有效。
@Path("users")
public class UserResource {
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("{user_id}/items")
public Response getItems(@PathParam("user_id") String userId) {
//get the items and return a response
}
}
@Path("items")
public class ItemResource {
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("{item_id}/users")
public Response getUsers(@PathParam("item_id") String itemId) {
//get the users and return a response
}
}
我决定实施建议的解决方案 here,即创建代表上述关系的特定资源。
对项目与用户相关的关系建模的代码是这样的:
@Path("users/{userId}/items")
public class RelatedItemResource {
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<Item> getRelatedItems(@PathParam("userId") String userId) {
// returns list of related items
}
// Other methods
}
建模用户与项目相关关系的代码是这样的:
@Path("items/{itemId}/users")
public class RelatedUserResource {
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<User> getRelatedUsers(@PathParam("itemId") String itemId) {
// returns the list of related users
}
// Other methods
}
对于连接到某个项目的所有用户,这听起来更像是一个用于获取用户列表的搜索条件。所以我建议这条路:/users?item={itemid}
。有了这种表示法,您就可以真正构建一个灵活的搜索条件端点,其中每个查询参数都是可选的,并且如果在其中给出了某个值,则会得到尊重。
我正试图解决泽西岛的这个 RESTful 场景:我有两个资源,用户和项目,我想检索连接到某个用户和所有用户的所有项目连接到某个项目。简而言之,User和Item之间存在多对多的关系。
我遇到了这个 RESTful 设计:
- 与某个用户关联的所有项目:
GET .../users/{user_id}/items
- 连接到某个项目的所有用户:
GET .../items/{item_id}/users
我如何在 Jersey 中实现它?我找到了 this 解决方案,但它与嵌套在根资源中的子资源有关,而在我的例子中,用户和项目都是根资源,可以通过它们自己的 URI 访问。
以下应该有效。
@Path("users")
public class UserResource {
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("{user_id}/items")
public Response getItems(@PathParam("user_id") String userId) {
//get the items and return a response
}
}
@Path("items")
public class ItemResource {
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("{item_id}/users")
public Response getUsers(@PathParam("item_id") String itemId) {
//get the users and return a response
}
}
我决定实施建议的解决方案 here,即创建代表上述关系的特定资源。
对项目与用户相关的关系建模的代码是这样的:
@Path("users/{userId}/items")
public class RelatedItemResource {
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<Item> getRelatedItems(@PathParam("userId") String userId) {
// returns list of related items
}
// Other methods
}
建模用户与项目相关关系的代码是这样的:
@Path("items/{itemId}/users")
public class RelatedUserResource {
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public List<User> getRelatedUsers(@PathParam("itemId") String itemId) {
// returns the list of related users
}
// Other methods
}
对于连接到某个项目的所有用户,这听起来更像是一个用于获取用户列表的搜索条件。所以我建议这条路:/users?item={itemid}
。有了这种表示法,您就可以真正构建一个灵活的搜索条件端点,其中每个查询参数都是可选的,并且如果在其中给出了某个值,则会得到尊重。