在REST中,如果要检索资源,可以使用以下内容: http://www.blabla.com/api/movies/1234 其中1234是数据库中电影的唯一标识符。 问题我如何从数据库中检索由2个属性标识的实体? 也许是这样的: http://www.blabla.com/api/grade/1234/764334532(由用户和考试ID组合确定) 或许我必须以其他方式对数据库或资源建模,例如在数据库中为成绩添加id。 你怎么看?感谢。
答案 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);
}
客户使用第一种方法insertRecension
来创建特定产品的订单。因此,您需要定义两个标识符,即为具有特定ID的产品创建新订单的客户的ID。
@Path( “{ID} /的productId / {PRODID} /校订”)
客户使用第二种方法getRecensions
来检索他创建的所有收据。为此,rest-endpoint只需知道一个标识符,即客户ID。
@Path( “{ID} /校订”)
最后一个方法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
}
然后,您只需指定两个查询参数中的一个,即可轻松找到考试或用户的所有成绩。