【问题标题】:PHP Cross Domain (AJAX) Proxy with Backbone带主干的 PHP 跨域 (AJAX) 代理
【发布时间】:2014-03-29 16:43:07
【问题描述】:

这是我面临的问题。

我正在域 A 上使用 Laravel 4 构建我的 rest api。

该 api 将为我在域 B 上的应用提供 JSON。

为了避免跨域政策问题,我做了两件事:

  1. 客户端 - 我在域 B 上下载了一个 PHP 代理脚本 - 并使用它向域 A 上的我的 api 发送 GET、POST 请求。

我使用了位于 github 上的脚本。

  1. 服务端,我已启用 Laravel 接受 CORS。

一切都很好,一切都在“有点”工作。

前端由 Backbone 控制,这让我找到了问题的根源。

查看代理的文档,这里是它应该如何与 jQuery 一起使用:

$('#target').load('http://www.yourdomain.com/proxy.php', {
    csurl: 'http://www.cross-domain.com/',
    param1: value1,
    param2: value2
});

基本上,我发送一个 csurl 与我的 REST Api 域的值 - domainA

其他参数(param1 和 param2)用于向 api 发送不同的东西,如 csrf 令牌等

回到 Backbone,我似乎无法让 Backbone 模型正常工作,而且我不确定如何处理发送参数。

这是主干模型:

var MyModel = Backbone.Model.extend({
    url: 'http://domainB.dev/proxy.php'
});

在我看来,我实例化它并尝试传递参数:

var myModel = new MyModel();
myModel.save({
    data: {
        csurl: 'http://domainA.dev'
        param1: 'mytoken'
    }
}, {
    success: function() {},
    error: function() {}
});

数据没有到达我的 api - 我在帖子中找到它,帖子确实有效 - 但我没有收到成功回调。

基本上,我不知道如何将代理的文档实现到 Backbone。

有什么想法吗?

【问题讨论】:

    标签: javascript php jquery ajax backbone.js


    【解决方案1】:

    我觉得和这里的问题是一样的

    Backbone model.save returning error while server sending 200:OK

    我查看了 proxy.php 脚本,没有找到任何 json 内容类型的标头。再说一遍: 您可以使用此代码 dataType: 'text' 来修复它

    myModel.save(
        {
            data: {
                csurl: 'http://domainA.dev'
                param1: 'mytoken'
            }
        },
        {
            dataType: 'text',
            success: function(){},
            error: function(){}
        }
    );
    

    ... 或通过将正确的 Content-type 标头设置为 application/json 值来修复服务器端。

    【讨论】:

    • 嗨,尤金,你好! - 我已经检查过 - Laravel(它保存我的 api,服务器端)发送正确的 JSON 标头 - 我已经检查了它,直接在我的浏览器中查看响应。问题是代理脚本,我相信它会将标题更改为“text/html” - 现在,我已将 dataTpe 文本添加到我的主干模型中,但它仍然无法正常工作
    • 我必须配置代理脚本并添加服务器的 url,以便脚本允许它。现在,我得到了带有正确标头的有效 JSON 响应,但 Backbone 的成功回调没有触发。这真的很奇怪。有什么想法吗?
    • 我不知道,在这种情况下我使用调试器:-)
    【解决方案2】:

    首先你需要删除模型中的 url 参数。

    var MyModel = Backbone.Model.extend({});
    

    然后创建一个集合。

    var MyCollection = Backbone.Collection.extend({
        model: MyModel,
        url: 'http://domainB.dev/proxy.php',
        parse: function(data) {
            return data;
        }
    });
    

    之后,用这个替换你的视图代码

    var that = this;
    formData = {
        csurl: 'http://domainA.dev',
        param1: 'mytoken'
    }
    this.collection = new MyCollection();
    this.collection.save({
        data: formData,
        success: function(collection, response) {
            console.log(that.collection);
            alert("success");
        },
        error: function() {
            alert("error");
        }
    }, {});
    

    【讨论】:

    • Ty Dato' - 从我所见,基本上我将通过集合而不是模型进行保存 - 为什么你认为它会起作用?你能解释一下为什么它不同的答案吗?
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2016-04-05
    • 2011-04-20
    • 2011-01-07
    相关资源
    最近更新 更多