什么';这是处理restapi的最佳方法&x27;s';创建';Backbone.js中的响应
我使用backbone.js与REST API交互,当发布到REST API以创建新资源时,REST API的响应状态为201,一个指向资源URI的“Location”头,但主体为空 当我现在创建一个新模型时,它是成功的,但是模型的本地表示只包含我显式设置的属性,而不包含将在服务器上设置的任何属性(创建日期等) 据我所知,主干将使用主体中的数据更新其模型表示(如果有)。但是,既然没有,就没有了 所以,很明显,我需要使用location头中的location来更新模型,但是最好的方法是什么呢 我目前的想法是,我必须从头部解析url,拆分id,为模型设置id,然后告诉模型fetch() 这看起来真的很乱。有没有更干净的方法 我对API有一些影响。让API作者返回新模型作为响应主体(同时保留201和位置头)是最好的解决方案吗什么';这是处理restapi的最佳方法&x27;s';创建';Backbone.js中的响应,rest,backbone.js,Rest,Backbone.js,我使用backbone.js与REST API交互,当发布到REST API以创建新资源时,REST API的响应状态为201,一个指向资源URI的“Location”头,但主体为空 当我现在创建一个新模型时,它是成功的,但是模型的本地表示只包含我显式设置的属性,而不包含将在服务器上设置的任何属性(创建日期等) 据我所知,主干将使用主体中的数据更新其模型表示(如果有)。但是,既然没有,就没有了 所以,很明显,我需要使用location头中的location来更新模型,但是最好的方法是什么呢 我目
谢谢 是的,backbone.js确实希望save(无论是PUT还是POST)的结果是一个可解析的主体,可以用来更新模型。如您所说,如果您对API有影响,您应该看看是否可以安排内容体包含资源属性 正如您所指出的,进行第二次在线调用以完全实现模型是没有意义的
可能状态代码200更合适。纯粹主义者可能认为201状态码意味着只返回一个位置,而不是实体。显然,这在这种情况下是没有意义的 听起来您需要进行一些定制。 可能会重写从继承的模型类的parse方法和url方法 主干。模型 继承的功能包括:
url : function() {
var base = getUrl(this.collection);
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
},
parse : function(resp) {
return resp;
},
您可以尝试以下方法:
parse: function(resp, xhr) {
this._url = xhr.getResponseHeader('location')
return resp
}
url: function() {
return this._url
}
由于主干网为0.9.9,我无法获得工作中可接受的答案。
parse
函数的签名在较旧的版本中似乎已更改,xhr
对象在函数签名中不再可用
这是我所做的一个示例,使其能够与主干v0.9.9和jQuery 1.8.3(使用a)一起工作,依赖于以下返回的
我没有使用success
回调,该回调可以在提供给Backbone.Model.save
函数的options
散列中指定,因为该回调是在接收XHR响应之前调用的。也就是说,存储对jqXHR
对象的引用并在success
回调中使用它是毫无意义的,因为调用回调时jqXHR
将不包含任何响应头
解决此问题的另一个方法是编写自定义
主干.sync
实现,但我不喜欢这种方法。我喜欢在解析方法中处理此问题。这可能会有所帮助:
window.CompanyView = Backbone.View.extend({
// ... omitted other functions...
// Invoked on a form submit
createCompany: function(event) {
event.preventDefault();
// Store a reference to the model for use in the promise
var model = this.model;
// Backbone.Model.save returns a jqXHR object
var xhr = model.save();
xhr.done(function(resp, status, xhr) {
if (!model.get("id") && status == "success" && xhr.status == 201) {
var location = xhr.getResponseHeader("location");
if (location) {
// The REST API sends back a Location header of format http://foo/rest/companys/id
// Split and obtain the last fragment
var fragments = location.split("/");
var id = fragments[fragments.length - 1];
// Set the id attribute of the Backbone model. This also updates the id property
model.set("id", id);
app.navigate('companys/' + model.id, {trigger: true});
}
}
});
}
});