【问题标题】:Non-RESTful HTTP POST with Backbone Model?具有主干模型的非 RESTful HTTP POST?
【发布时间】:2015-05-21 20:50:37
【问题描述】:

我一直在看这个文档:

http://backbonejs.org/#Sync

http://addyosmani.github.io/backbone-fundamentals/#backbones-sync-api

尝试弄清楚如何发出 HTTP POST 请求以获取一些 JSON 数据以加载到我的模型中。遗憾的是,Web 服务不是 RESTful,所以我正在做一个 POST 请求,而实际上它应该是一个 GET 请求。这就是生活……

我最终得到了以下结果,但我不确定这是否是正确的方法,或者是否有更简单的方法,并且因为我没有严格使用 REST 模式,所以我似乎无法找到可以解决的问题我使用 Backbone 模式提供的服务。

    define([
    'underscore',
    'backbone',
], function (_, Backbone)
{
    'use strict';

    //model class declaration
    var LocationsModel = Backbone.Model.extend({

        locations : null, //this stores the json data of buildings and locations

        //url for http post to get location data
        url: '/locations',

        //http request settings
        requestType: 'POST',
        requestContent : 'application/json; charset=utf-8',
        requestBody: { "lastRefreshedDateTime": "2015-04-01T08:18:06.000+00:00", "uid": "12356789" },
        requestData: 'json',

        /**
         @name constructor
         @method initialise
        **/
        initialize: function (xhr)
        {
            this.doPOST();
        },

        /**
         @name doPOST
         @method doPOST
         @summary uses AJAX HTTP POST to fetch data from EAS
        **/

        doPOST: function ()
        {
            $.ajax({
                type: this.requestType,
                data: this.requestBody,
                contentType: this.requestContent,
                dataType: this.requestData,
                url: "http://" + window.location.host + this.url,
                success: function (result)
                {
                    this.locations = result;
                },
                error: function (jqXHR, textStatus, errorThrown)
                {
                    //TODO - load cached JSON of buildings and locations
                },
            });
        }


    });

    return LocationsModel;

});

所以这段代码本质上是

  1. 使用标头信息构建 POST 请求
  2. 提出请求
  3. 如果成功,将 JSON 响应加载到模型中

我还能再抽象一下吗?

【问题讨论】:

    标签: javascript ajax json backbone.js


    【解决方案1】:

    覆盖.fetch()

    var RestlessModel = Backbone.Model.extend({
        defaults: function(){
            return {
                locations: []
            }
        },
        //url for http post to get location data
        url: '/locations',
    
        //http request settings
        fetchOverride: {
            type: 'POST',
            contentType : 'application/json; charset=utf-8',
            data: JSON.stringify({ "lastRefreshedDateTime": "2015-04-01T08:18:06.000+00:00", "uid": "12356789" }),
            dataType: 'json',        
        },
        fetch: function(options){
            options = _.extend(options || {}, this.fetchOverride);
            Backbone.Model.prototype.fetch.call(this, options);
        }
    
    });
    

    See fiddle^^

    如果您需要处理请求响应,请覆盖.parse()

    【讨论】:

    • 感谢此代码。我将把它变成一个辅助类,这样我就可以将它用于多个请求。您对此有何看法?
    • 我需要看大局,但考虑进一步扩展,即SomeConcreteModel = RestlessModel.extend({ ... }),因此您不必每次都重写覆盖。最重要的是,您可能希望通过模型函数提供请求 data,因为我认为它可能因请求而异。
    • 谢谢,只有一个问题。运行 model.fetch() 后数据存储在哪里我在控制台中检查了模型对象并且找不到我的 JSON 响应数据?
    • attributes,如果一切顺利的话。可以像往常一样通过get() 访问单个属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多