以相互方式交织泽西岛的资源

Intertwining resources in Jersey in a mutual way

我正试图解决泽西岛的这个 RESTful 场景:我有两个资源,用户和项目,我想检索连接到某个用户和所有用户的所有项目连接到某个项目。简而言之,User和Item之间存在多对多的关系。

我遇到了这个 RESTful 设计:

我如何在 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}。有了这种表示法,您就可以真正构建一个灵活的搜索条件端点,其中每个查询参数都是可选的,并且如果在其中给出了某个值,则会得到尊重。