【发布时间】:2017-12-21 19:06:42
【问题描述】:
我需要帮助来创建 REST 端点。有几个活动:
要更改电子邮件,需要 3 个 URL 请求:
-
/changeemail : 这里一次性密码 (OTP) 被发送到用户的手机
-
/users/email : 用户发送上一步的一次性密码,系统发送邮件给新用户点击邮件激活链接
-
/activateemail : 用户点击新邮件收件箱中的链接,服务器更新新邮件
修改密码:
- /users/password (PATCH) : 用户提交旧密码和新密码,系统相应更新新密码
同样,还有其他端点可以更改个人资料(字段包括生日、名字和姓氏)
在线阅读后,我相信我的系统只有 users 作为资源 --> 所以为了更新我正在考虑使用单个 PATCH 更改电子邮件和更改密码的属性以及类似操作字段的内容,所以以上两个功能看起来像:
换邮箱:
- 操作:'sendOTPForEmailChange'
- 操作:'sendEmailActivationLink'
- 操作:'activateEmail'
修改密码:
- 操作:“更改密码”
对于上述所有操作,我将只有一个端点(在 nodejs 中):
app.patch('/users', function (req, res) {
// depending upon the operation I delegate it to the respective method
if (req.body.operation === 'sendOTPForEmailChange') {
callMethodA();
} else if (req.body.operation === 'sendEmailActivationLink') {
callMethodB();
} else if (req.body.operation === 'activateEmail') {
callMethodC();
} else if (req.body.operation === 'changePassword') {
callMethodC();
} else sendReplyError();
});
这听起来是个好主意吗?如果没有,有人可以帮我形成 changeemail 和 changepassword 的端点。
回答:
我最终决定在 HTTP 请求正文中使用带有操作字段的 PATCH 来指示必须执行的操作。 因为我只修改了资源的一个字段,所以我使用了 PATCH 方法。 另外,我想避免在 URI 中使用动词,因此使用“操作”字段看起来更好。
我在做这个决定时参考了一些参考资料:
威尔茨回答link here
马克诺丁汉的博客link article
最后是 JSON MERGE PATCH link RFC
【问题讨论】:
-
我正在使用带有路由、控制器和模型的 nodejs,并且有一个用于更改生成的电子邮件请求代码的数据库,这些代码作为电子邮件发送给用户。上面的例子在路由和控制器方面会是什么样子
-
即使是编辑配置文件,我也会使用相同的端点,如 /users/:user_id 和操作:getProfile。