我正在公开一个REST API,只要你做CRUD(创建,更新,删除),就可以轻松顺利地工作。但我有这个Tickets返回票证列表(get),Ticket / {id}获取特定项目(get)和激活方法(put),将票证状态从未激活更改为激活。
现在我需要让REST'消费者'能够做类似的事情(在ws中会被称为:GetAndActivateRandomTicket(),它让我想知道,应该在REST上描述什么?这是一个帖子一个put?a get ?.目标是获得随机数量的票,并将其状态设置为活动状态。类似于get&放置的东西,但事先不知道put {id}。 / p>
应该是/ Tickets?activate = true& amount = 5?什么动词?我应该使用动词而不是名词吗?关于这个问题的“最佳实践”是什么?
感谢。
答案 0 :(得分:4)
如果重复操作做了不同的事情(例如,激活不同的票证),则不是幂等。非幂等操作总是映射到RESTful架构中的POST(或自定义动词)。
答案 1 :(得分:3)
某些资源很容易识别并存在于域中。然而,正如你所指出的那些有些棘手。但是ROA(面向资源的架构)需要一些时间来适应。任何东西都可以成为包括交易,会话和其他此类非域实体的资源:)
在您的情况下,您似乎拥有“算法”资源 - 选择随机数量的故障单并激活它们。我确信这种“随机性”有一些方法来选择不是纯粹随机的票,否则会因为获得已经激活的票集而浪费计算。
所以我不确定你的激活是如何发生的 - 有人选择激活一堆票(复选框)还是只是'数据包'的一部分而没有人为干预?
你的描述似乎暗示后者 - 所以一个好的做法是做你刚才所说的: 网址上有多个选项:
您的资源是算法,并且读取它时人类的“网络消费者”会立即理解以前的网址, = true 可能不太清楚,但这可能只是我。由于大多数框架能够解析查询参数并通过“&”拆分,因此还有使用后者的趋势。和分号可能只需要一些工作
如果有人工干预,您可以将其分成两部分:
希望这会有所帮助:)
答案 2 :(得分:2)
首先,GET应该是幂等的,永远不会对资源进行任何更改。应使用PUT激活资源。
我要做的是创建像/ Tickets / Random这样的资源URL,因为GET会返回一个HTTP 303,将用户重定向到随机确定的实际资源URL,如/ Tickets / 12345。然后,用户可以使用PUT激活此票证。所有用户应用程序需要知道的是/ Tickets / Random URL,只要有任何内容,他就可以继续激活票证。
答案 3 :(得分:1)
我提取了这个:
任何事物都可以成为包括交易,会话和其他此类非域实体的资源:)
然后去了:
TicketActivation资源。
带有查询参数金额的[POST]将返回一组激活的随机票据。 并返回资源URL,以便您可以得到/ ticket / id = 1,2,3,4,5 [GET]将使用可选的id过滤器以正常方式返回票证以返回多张票证 [PUT]也将使用id的过滤器,并根据参数设置激活true或false。
所以我可以这样做:
[post]
/ticket/activation/?amount=5
返回的资源将类似于/ ticket?id = 1,2,3,4,5 所以我可以发布它。
[get]
/ticket?id=1,2,3,4,5
[put]
/ticket/activation?id=1,2,3,4,5&deActivate [OR]
/ticket/activation?id=1,2,3,4,5&activate
我想这是最优雅,也是RESTfull和这个问题的明确解决方案,我想分享以供将来参考。此外,如果您认为此方法存在问题,请随时对其进行评论。