为非资源指定的资源定义多插入的RESTful URL?
例如,我们有Users
和Products
,每个用户可以请求每个产品的优惠券。此标志存储这样的:为非资源指定的资源定义多插入的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。
我明白了,所以当操作没有指定用户的id时,省略/ users路径是有效的。非常感谢! –
当然可以。只要路径唯一标识一个资源,那么你可以从中省略一些东西。假设您想要获得id为1的产品。GET/products/1而不是GET/users/products/1更有意义。没有什么能够阻止你使用后者,但它很混乱,可读性较差。 – martingreber