【发布时间】:2013-06-22 02:36:27
【问题描述】:
我在 Backbone 中建立了一个简单的用户模型
define([
'underscore',
'backbone'
], function(_, Backbone) {
var UserModel = Backbone.Model.extend({
urlRoot: '/api/user',
idAttribute: '_id',
defaults: {
userName: '',
password: ''
personalDetails: {
title: '',
name: {
firstName: '',
lastName: ''
},
gender: '',
dob: ''
}
}
});
return UserModel;
});
在模型上调用 save() 将向 /api/user/:id 发出 PUT 请求,这很好。
但是,在前端我想要 3 个表单 - updatePersonalDetails、updateUserName、updatePassword。
在我当前的实现中,这些都将使用相同的模型,并且所有save() 都使用相同的端点/api/user/:id。我的问题是我不知道用户发布了哪个表单。
在仍符合 RESTful 标准的同时,解决此问题的最佳方法是什么?有 3 个独立的模型 - UserDetailsModel、UserPasswordModel 等?或者只对整个模型进行批量更新,无论用户发布哪种形式。
【问题讨论】:
-
有趣的问题,这是我个人对 REST 的不满之一,因为它经常出现:我们基本上是通过 HTTP 接口访问数据库插入、更新和删除。
-
@mtsr,这是对 REST API 的整体看法。您应该始终要求用户登录,如果不是,发送
401 Unauthorized,然后检查他们的权限,如果是这种情况,发送403 Forbidden。 -
@redeye,我认为你不需要“知道”模型中发送了什么表格。我相信最好的办法是调用模型的不同方法,这会以不同的方式触发保存,只发送相关数据。我不确定,但我相信这符合 REST。
-
@gustavohenke 当然,您仍然可以保护您的 REST API,但是拥有比特定模型、模型实例或自定义字段检查的更新更细粒度的过滤器不是很好吗?例如。类似界面的更多命令,您不会将 PUT 发送到 /user/1 而是 /user/1/changeAddress?
-
感谢您的回复。看来我可以发出 PATCH 请求。例如this.model.save(attr, {PATCH: true});这只会将提供的 attr 发送到服务器。这提出了另一个问题——我需要在服务器上进行表单验证,所以我仍然需要了解用户发布的表单。我想避免嗅探服务器上的 req.body
标签: javascript node.js backbone.js