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

时间:2016-06-14 19:57:56

标签: api rest

例如,我们有UsersProducts,每个用户都可以申请每件商品的优惠券。该标志存储如下:

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 {{1}的用户可以获得优惠券代码。

所以我想按批量插入操作的方式插入以下数据。

requested_at

在这种情况下,首先我尝试应用像ASCII这样的RESTful URL Users_Coupons {"user_id": 1, "product_id": 1, "coupon_code": "ABXXYZ", "is_redeemed": false}, :
但是这会跳过POST /users/products/:product_id/coupons的资源标识符。我不确定这样做是否常见。

当然我可以先让客户打电话 users
然后检索所有user_ids并在此之后发出POST请求。 但是如果可能的话,我想实现这个只有一个单独的API调用,因为服务器也知道应该分配优惠券给谁,条件可能不会改变。

我还看到了Facebook和Google的GET /users?product_id={product_id}&is_coupon_requested=true&sort=is_requested_at&limit=X操作方法, https://developers.facebook.com/docs/graph-api/making-multiple-requests
这实现了我想做的事情,但我觉得它对于一个没有提供这么多API的小型系统而言过度杀戮。

或仅仅Batch更好吗,因为我无法指定POST /products/:product_id/coupons? 我想知道这种需求的共同或最佳实践。感谢。

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

POST /products/:productId/users/:userId

然后让服务器使用提供的:productId和numberOfCoupons进行批量插入。 PUT与POST的选择取决于您希望如何处理对此资源的多次调用。也就是说,它是否是idempotent

  

或者仅仅POST / products /:product_id /优惠券更好,因为我   无法指定user_id?

如果你愿意,没有什么能阻止你指定user_id:

...
.attr("id",function(d){ return "id-"+d;})

...
d3.select("#id-50").append("text").attr("id",202)

虽然我认为后者并不是你所追求的,因为你只想根据产品y分配一些x优惠券。