2

我正在使用 Symfony2 开发一个 REST API。我有一个预订系统,我想在客户的预订得到管理员验证后向他发送一封电子邮件。

我有一个 Reservation 资源,我们可以使用以下 url 验证预订:

补丁 localhost/:id/验证

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

如果没有,正确的方法应该是什么?

谢谢,迈赫迪。

4

2 回答 2

10

首先,关于资源和 REST。

当您说PATCH localhost/:id/validate您应该将其阅读为“我正在更新现有的验证”时。“验证”什么都不是,甚至不是正确的英语。验证不是资源,它是一个动作。当您的 URL 中有操作(动词)时,您的 API 是 RPC,而不是 REST。也可以在这里查看我更长的答案

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

  • 您正在更新预订
  • 您正在为预订创建验证
  • 您正在用该预留的经过验证的版本替换该预留。

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

当一个预订有许多验证时,第二个是必要的。或者当 REST 客户端需要与保留分开跟踪验证时(例如 a 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 永远不会有副作用,因此客户端可以确定重放此操作(例如网络错误、负载过重或其他情况)永远不会导致用户收到垃圾邮件。

于 2017-06-15T14:08:18.593 回答
2

如果目标是验证,不是POST更合适吗?验证的概念更像 RPC,而不是资源。根据RFC 5789PATCH应该用于部分修改资源。

于 2014-03-24T18:17:08.743 回答