我正在使用Symfony2开发REST API。我有一个预订系统,我希望在他的预订由管理员验证时向客户发送电子邮件。
我有预订资源,我们可以使用此网址验证预订:
PATCH localhost /:id / validate
我想知道在使用PATCH方法验证资源时将电子邮件内容放入请求正文是否正确。
如果不是,那么正确的方法应该是什么?
谢谢, 梅迪。
答案 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
应该用于部分修改资源。