HTTP PATCH方法。请求正文中的内容

时间:2014-03-24 18:10:52

标签: http rest http-patch

我正在使用Symfony2开发REST API。我有一个预订系统,我希望在他的预订由管理员验证时向客户发送电子邮件。

我有预订资源,我们可以使用此网址验证预订:

PATCH localhost /:id / validate

我想知道在使用PATCH方法验证资源时将电子邮件内容放入请求正文是否正确。

如果不是,那么正确的方法应该是什么?

谢谢, 梅迪。

2 个答案:

答案 0 :(得分:4)

首先,关于资源和REST。

当您说PATCH localhost/:id/validate时,您应将其视为“我正在更新现有验证”。 “A Validate”什么都不是,甚至不是正确的英语。验证不是资源,它是一个操作。当您的URL中有动作(动词)时,您的API是RPC,而不是REST。另请参阅my longer answer here

所以,考虑一下真正做什么。以下之一:

  • 您正在更新预订
  • 您正在预订中创建验证
  • 您正在使用该预订的验证版本替换预订。

第一个是最有意义的,也是最简单的 PATCH /reservations/{id} status=valid
预订是否已经收到电子邮件地址?然后使用它。否则请考虑发送电子邮件。
PATCH /reservations/{id} status=valid&email=foo@example.com
这读作“使用以下值更新预订电子邮件和状态”。 由于PATCH(和POST)可能有副作用,发送邮件完全没问题。

当一个预订有许多验证时,第二个是必要的。或者当REST客户端需要与预留分开跟踪验证时(例如GET /reservations/{id}/validations/{id})。在这些情况下,拥有Validation资源是有意义的 POST /reservations/{id}/validations
如果预订没有电子邮件地址,请将其发送 POST /reservations/{id}/validations email=foo@example.com
这读作“在电子邮件foo@example.com上对此预订进行验证”。 这读作“我对此预订进行了新的验证”。由于POST(和PATCH)可能有副作用,发送邮件完全没问题。

第三种情况很重要,因为有副作用。如果你想提出一种方法,客户可以确定没有副作用,这就发挥作用 PUT /reservations/{id} room=12&date=1970-01-01&status=valid&email=foo@example.com
这读作“用具有验证状态的验证替换现有预留”。由于PUT永远不会产生副作用,因此客户可以确定重播(例如网络错误,重负载或其他任何情况)将永远不会导致用户被垃圾邮件。

答案 1 :(得分:1)

如果目标是验证,那么POST更合适吗?验证的概念比类似资源更像RPC。根据{{​​3}},PATCH应该用于部分修改资源。