Web services 在REST中,如何检索由2个属性标识的资源?

Web services 在REST中,如何检索由2个属性标识的资源?,web-services,rest,restful-architecture,Web Services,Rest,Restful Architecture,在REST中,如果要检索资源,可以使用以下方法: 其中1234是数据库中电影的唯一标识符。 我的问题是,如何从数据库中检索由2个属性标识的实体? 可能是这样的: (由用户和考试id组合标识) 或者我必须以其他方式对数据库或资源进行建模,比如在数据库中的成绩中添加id。 你怎么认为?谢谢。如果您的考试id是全局唯一的,您可以在URI中使用它。无需参考用户: http://www.blabla.com/api/exams/123 如果考试id对用户来说只是本地唯一的,那么您需要包括这两个id,如下

在REST中,如果要检索资源,可以使用以下方法: 其中1234是数据库中电影的唯一标识符。 我的问题是,如何从数据库中检索由2个属性标识的实体? 可能是这样的: (由用户和考试id组合标识) 或者我必须以其他方式对数据库或资源进行建模,比如在数据库中的成绩中添加id。
你怎么认为?谢谢。

如果您的考试id是全局唯一的,您可以在URI中使用它。无需参考用户:

http://www.blabla.com/api/exams/123
如果考试id对用户来说只是本地唯一的,那么您需要包括这两个id,如下所示:

http://www.blabla.com/api/users/456/exams/123

您需要注意您的资源地址是唯一的。下面是一个客户服务示例(JAX-RS),它使用户能够插入和检索特定产品的更新

/**
 * Abstract service customer. Contains methods for retrieving and persisting
 * data in database.
 */
@Path("/customers")
public interface ServiceCustomer extends Service<Customer, Integer> {

    /**
     * Adds a customers {@link Recension} to a product
     * 
     * @param recension
     *            The new created {@link Recension} by the customer
     * @param customerId
     *            Identifier of the customer as Integer who has created the
     *            recension
     * @param productId
     *            Identifier of the product as Integer which should be
     *            associated with the new created recension
     * @return {@link Response}
     */
    @POST
    @Path("{id}/productId/{prodId}/recension")
    @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public Response insertRecension(Recension recension,
            @PathParam("id") Integer customerId,
            @PathParam("prodId") Integer productId);

    /**
     * Retrieves all customers {@link Recension}(s)
     * 
     * @param customerId
     *            Identifier of the {@link Customer} as int
     * @return {@link Response}, containing a {@link List} of all created
     *         {@link Recension}(s) by the customer
     */
    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    @Path("{id}/recension")
    public Response getRecensions(@PathParam("id") int customerId);

    /**
     * Retrieves a single {@link Recension} of a {@link Product} which was
     * created by a specific {@link Customer}
     * 
     * @param productID
     *            Identifier of the {@link Product}
     * @param customerID
     *            Identifier of the {@link Customer}
     * @return {@link Response}, which contains the {@link Recension} of the
     *         {@link Product} created by the user. Assuming the user has
     *         created a recension.
     */
    @GET
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    @Path("{id}/productId/{prodId}/recension")
    public Response getRecensionOfProductByCustomer(
            @PathParam("prodId") int productID, @PathParam("id") int customerID);
}
/**
*抽象服务客户。包含检索和持久化的方法
*数据库中的数据。
*/
@路径(“/customers”)
公共接口服务客户扩展服务{
/**
*将客户{@link Recension}添加到产品
* 
*@param-recension
*客户创建的新{@link Recension}
*@param customerId
*创建客户的整数客户的标识符
*重新修订
*@param productId
*作为整数的产品标识符,应为
*与新创建的修订关联
*@return{@link Response}
*/
@职位
@路径(“{id}/productId/{prodId}/recension”)
@使用({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
公共响应插件(Recension-Recension,
@PathParam(“id”)整数自定义id,
@PathParam(“prodId”)整数prodId);
/**
*检索所有客户{@link Recension}
* 
*@param customerId
*{@link Customer}的标识符为int
*@return{@link Response},包含所有已创建内容的{@link List}
*{@link Recension}由客户提供
*/
@得到
@产生({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
@路径(“{id}/recension”)
公共响应getRecensions(@PathParam(“id”)int customerId);
/**
*检索{@link Product}的单个{@link Recension},该产品是
*由特定的{@link Customer}创建
* 
*@param productID
*{@link Product}的标识符
*@param customerID
*{@link Customer}的标识符
*@return{@link Response},其中包含
*{@link Product}由用户创建。假设用户
*创建了一个新版本。
*/
@得到
@产生({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
@路径(“{id}/productId/{prodId}/recension”)
公众响应getRecensionOfProductByCustomer(
@PathParam(“prodId”)int productID、@PathParam(“id”)int customerID);
}
  • 第一种方法
    insertRecension
    由客户用于创建特定产品的recension。因此,您需要定义两个标识符,即为具有特定id的产品创建更新的客户的id

    @路径(“{id}/productId/{prodId}/recension”)

  • 客户使用第二种方法
    getRecensions
    检索他创建的所有recensions。为此,rest端点只需要知道一个标识符,即客户id

    @路径(“{id}/recension”)

  • 最后一个方法
    getRecensionOfProductByCustomer
    检索特定用户创建的特定产品的recension。注意,这个rest端点也需要两个标识符

    @路径(“{id}/productId/{prodId}/recension”)


  • 很难说没有更多的信息,但是我会考虑一个轻量级的等级URI,每个等级是考试和用户的交集:

    GET /grades?exam=3&userId=bob
    {
        "id": 343,
        "self": "/grades/343",
        "exam": "/exams/3",
        "user": "/users/bob",
        "value": 88
    }
    

    然后,只需指定两个查询参数中的一个,您就可以轻松找到考试或用户的所有成绩。

    谢谢您的建议。问题是,当使用该()时,我并没有很清楚地看到我检索的实体是一个等级,而不是一个考试或用户。其他标准对这个案子有什么规定吗?谢谢,这是我目前得到的最好答案。REST只指导您在设计中使用资源。困难的部分实际上是找出如何将您的问题域分解为这些资源。你可以决定用户有考试,考试有分数,但我怀疑分数是否有足够的“肉”来证明他们自己的资源。类似地,您可以确定用户拥有一个名为reportCard的资源,该资源显示他或她每次考试的所有成绩(然后该资源将有到考试的链接)。如果您提供更多关于域空间的详细信息,或许我可以提供更多帮助。我不确定这是否是REST中的正确方式。