Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是处理restapi的最佳方法&x27;s';创建';Backbone.js中的响应_Rest_Backbone.js - Fatal编程技术网

什么';这是处理restapi的最佳方法&x27;s';创建';Backbone.js中的响应

什么';这是处理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与REST API交互,当发布到REST API以创建新资源时,REST API的响应状态为201,一个指向资源URI的“Location”头,但主体为空

当我现在创建一个新模型时,它是成功的,但是模型的本地表示只包含我显式设置的属性,而不包含将在服务器上设置的任何属性(创建日期等)

据我所知,主干将使用主体中的数据更新其模型表示(如果有)。但是,既然没有,就没有了

所以,很明显,我需要使用location头中的location来更新模型,但是最好的方法是什么呢

我目前的想法是,我必须从头部解析url,拆分id,为模型设置id,然后告诉模型fetch()

这看起来真的很乱。有没有更干净的方法

我对API有一些影响。让API作者返回新模型作为响应主体(同时保留201和位置头)是最好的解决方案吗


谢谢

是的,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});
                }
            }
        });
    }
});