当您需要使用REST api的动词时,最好的做法是什么?

时间:2011-07-03 03:30:15

标签: api rest

我正在公开一个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?什么动词?我应该使用动词而不是名词吗?关于这个问题的“最佳实践”是什么?

感谢。

4 个答案:

答案 0 :(得分:4)

如果重复操作做了不同的事情(例如,激活不同的票证),则不是幂等。非幂等操作总是映射到RESTful架构中的POST(或自定义动词)。

答案 1 :(得分:3)

某些资源很容易识别并存在于域中。然而,正如你所指出的那些有些棘手。但是ROA(面向资源的架构)需要一些时间来适应。任何东西都可以成为包括交易,会话和其他此类非域实体的资源:)

在您的情况下,您似乎拥有“算法”资源 - 选择随机数量的故障单并激活它们。我确信这种“随机性”有一些方法来选择不是纯粹随机的票,否则会因为获得已经激活的票集而浪费计算。

所以我不确定你的激活是如何发生的 - 有人选择激活一堆票(复选框)还是只是'数据包'的一部分而没有人为干预?

你的描述似乎暗示后者 - 所以一个好的做法是做你刚才所说的: 网址上有多个选项:

  • / Tickets?amountToActivate = 5;激活(注意分号和'word'激活)
  • / Tickets?amountToActivate = 5& activate = true(注意:我个人觉得上面的情况更好,因为 = true 实际上是多余的,它是非宁静URI的工件,大多数人都会明确表示state = true - 它就像在URL中写'activate'一样好(暗示是真的)缺席意味着错误:)

您的资源是算法,并且读取它时人类的“网络消费者”会立即理解以前的网址, = true 可能不太清楚,但这可能只是我。由于大多数框架能够解析查询参数并通过“&”拆分,因此还有使用后者的趋势。和分号可能只需要一些工作

如果有人工干预,您可以将其分成两部分:

  • GET:/ Tickets?fetchRandomAmountOfTickets = 100(因为它是算法)
  • PUT:/ Tickets(PUT的激活'更新'部分,用于您上面'GOT'的门票列表)

希望这会有所帮助:)

答案 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和这个问题的明确解决方案,我想分享以供将来参考。此外,如果您认为此方法存在问题,请随时对其进行评论。