为非资源指定的资源定义多插入的RESTful URL?

问题描述:

例如,我们有UsersProducts,每个用户可以请求每个产品的优惠券。此标志存储这样的:为非资源指定的资源定义多插入的RESTful URL?

Users_Products 
{"user_id": 1, "product_id": 1, "is_coupon_requested": true, "requested_at": "2016-04-01"}, 
{"user_id": 1, "product_id": 2, "is_coupon_requested": false, "requested_at": "2016-04-21"}, 
{"user_id": 2, "product_id": 1, "is_coupon_requested": true, "requested_at": "2016-06-01"}, 
: 

,在某些时候一个管理员用户需要通过指定产品的ID和优惠券的数量X分配实际的优惠券代码给用户,以便谁拥有*用户X最早requested_at可以获得优惠券代码。

所以我想插入下面​​的数据,通过种类的插入操作。

Users_Coupons 
{"user_id": 1, "product_id": 1, "coupon_code": "ABXXYZ", "is_redeemed": false}, 
: 

在这种情况下,首先我试图运用REST风格的URL像
POST /users/products/:product_id/coupons
但这跳过的users资源标识符。我不确定这是否很常见。

当然我可以让客户端调用首先
GET /users?product_id={product_id}&is_coupon_requested=true&sort=is_requested_at&limit=X
然后检索所有user_ids,使后POST请求。 但是如果可能的话,我只想实现这个唯一的API调用,因为服务器也知道谁应该分发优惠券,并且条件可能不会改变。

我也看到了Facebook和谷歌的Batch操作方法, https://developers.facebook.com/docs/graph-api/making-multiple-requests
这实现了我想做的事,但我觉得它比杀了一个微小的系统,不提供这么多的API。

或者只是POST /products/:product_id/coupons更好,因为我无法指定user_id? 我想知道这种需求的常见或最佳做法。谢谢。

你可以这样做:

Request: PUT /products/:productId/coupons 
Body: 
{ 
numberOfCoupons: 2 
} 

然后让服务器做与提供的批量插入列:ProductId和numberOfCoupons。 PUT vs POST的选择取决于您希望如何处理对此资源的多个呼叫。也就是说,它是否是idempotent

抑或是最好只POST /产品/:PRODUCT_ID /优惠券,因为我 不能指定user_ID的?

没有什么从指定USER_ID阻止你,如果你想:

POST /products/:productId/users/:userId 

虽然我认为后者是不是真的你是什么后,因为你只是想指定一个数字x券基于产品y。

+0

我明白了,所以当操作没有指定用户的id时,省略/ users路径是有效的。非常感谢! –

+0

当然可以。只要路径唯一标识一个资源,那么你可以从中省略一些东西。假设您想要获得id为1的产品。GET/products/1而不是GET/users/products/1更有意义。没有什么能够阻止你使用后者,但它很混乱,可读性较差。 – martingreber