我需要对服务器端API进行POST。我必须将level_id
密钥发送到服务器的请求正文中。
我使用的是Backbone模型。但是当我这样做时:
count
触发的网络请求是:id
Backbone没有POST但是PUT并将id附加到url。
所以我只想在没有Backbone注意的情况下将myModel.set("id", somevalue)
myModel.save()
密钥传递给服务器。
答案 0 :(得分:2)
Backbone已预先配置为与RESTful API同步。
[...]
默认
sync
handler将CRUD映射到REST,如下所示:
- 创建→
POST /collection
- 阅读→
GET /collection[/id]
- 更新→
PUT /collection/id
- 补丁→
PATCH /collection/id
- 删除→
DELETE /collection/id
新条目没有ID,因此如果您在保存之前为模型提供ID,Backbone默认为PUT请求,因为它认为您要保存现有条目。
选择以下解决方案之一。
这个是显而易见的。如果可以的话,坚持标准。
更改API以处理PUT / PATCH请求,并仅在创建时使用POST。使API endpoit从URL中获取ID。
type
选项 1 简单,适用于一次性情况。
传递给save
(或fetch
)的每个选项都会覆盖sync
函数默认定义的选项,并传递给jQuery.ajax
function。
// Make the request, allowing the user to override any Ajax options. var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
var url = model.url(); // get the url before setting the `id`
model.save({
id: somevalue
}, {
url: url, // fix the url
type: 'POST' // choose the HTTP verb
});
修复模型使用的网址很简单,您还有一些选择:
url
选项(如上所述)url
function 覆盖url
函数(source)适用于每个调用都应使用特定网址而不附加默认id
的情况。
var MyModel = Backbone.Model.extend({
url: function() {
return _.result(this, 'urlRoot') ||
_.result(this.collection, 'url') ||
urlError();
}
});
idAttribute
这取决于您在数据中尝试传递的id
内容。
Backbone Model使用"id"
具有默认的id属性名称。您可以通过覆盖模型的idAttribute
property来指定其他名称。无论名称是什么,它总是通过model.id
property自动提供。
现在,假设id
属性与此模型无关,并且此模型的真实ID属性名称类似UID
,则可以更改idAttribute
模型的反映属性的真实名称(或者它甚至可能是一个永远不会成为属性的字符串)。
var MyModel = Backbone.Model.extend({
idAttribute: 'UID',
});
现在,id
属性不被视为当前模型的ID,model.isNew()
将返回true
,发送POST请求以在保存时创建它。
sync
/ save
功能行为如果您使用的API 不 RESTful,则可以通过覆盖sync
function来调整行为。这可以在模型或集合上完成,也可以在集合和模型默认使用的Backbone.sync
function上完成。
例如,如果您希望每个请求都默认使用POST MyModel
class:
var MyModel = Backbone.Model.extend({
sync: function(method, model, options) {
return Backbone.sync.call(this, method, model,
_.extend({ type: 'POST' }, options));
}
});
您可以执行与save
功能类似的操作,让fetch
像往常一样执行GET
请求。
emulateHTTP
setting 2 如果您想使用不支持的旧版Web服务器 Backbone的默认REST / HTTP方法,您可以选择打开
Backbone.emulateHTTP
。设置此选项会假冒PUT
,PATCH
和 使用HTTPDELETE
的{{1}}次请求,设置POST
用真正的方法标题。[...]
X-HTTP-Method-Override
Backbone.emulateHTTP = true;
model.save(); // POST to "/collection/id", with "_method=PUT" + header.
此模型是否已保存到服务器了?如果模型还没有 有一个id,它被认为是新的。
本网站上的其他一些答案建议覆盖isNew
function。的唐'吨即可。该函数有其目的并覆盖它以强制POST请求是一个糟糕的黑客,而不是解决方案。
isNew
在内部使用,但您的代码或其他库以及Backbone插件也可以使用它。
1 虽然我没有从堆栈溢出中获取它,但它已经是an answer by Andrés Torres Marroquín on a similar question。
2 取自Maanas Royy's answer。