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

时间:2014-05-18 10:21:58

标签: web-services rest restful-architecture

在REST中,如果要检索资源,可以使用以下内容: http://www.blabla.com/api/movies/1234 其中1234是数据库中电影的唯一标识符。 问题我如何从数据库中检索由2个属性标识的实体? 也许是这样的: http://www.blabla.com/api/grade/1234/764334532(由用户和考试ID组合确定) 或许我必须以其他方式对数据库或资源建模,例如在数据库中为成绩添加id。 你怎么看?感谢。

3 个答案:

答案 0 :(得分:1)

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

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

如果考试ID仅对用户来说是本地唯一的,那么您需要包括两者,如下所示:

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

答案 1 :(得分:1)

您需要注意您的资源是唯一解决的。下面是一个客户服务示例(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);
}
  1. 客户使用第一种方法insertRecension来创建特定产品的订单。因此,您需要定义两个标识符,即为具有特定ID的产品创建新订单的客户的ID。

    @Path( “{ID} /的productId / {PRODID} /校订”)

  2. 客户使用第二种方法getRecensions来检索他创建的所有收据。为此,rest-endpoint只需知道一个标识符,即客户ID。

    @Path( “{ID} /校订”)

  3. 最后一个方法getRecensionOfProductByCustomer检索由特定用户创建的特定产品的缩进。请注意,此rest-endpoint也有两个标识符!

    @Path( “{ID} /的productId / {PRODID} /校订”)

答案 2 :(得分:0)

如果没有更多信息,很难说,但我会考虑一个轻量级/成绩URI,其中每个年级都是考试和用户的交集:

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

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