2014-03-29 99 views
0

以下是我正面临的问题。带有Backbone的PHP跨域(AJAX)代理

我在域A.建设我的REST API与Laravel 4

的API将提供JSON的,以我的应用程序,它是在域B.

为避免交叉来源政策问题,我已经做了两件事:

  1. 客户端 - 我已经下载了一个PHP代理脚本 - 上域B - ,并用它来发送GET,POST请求我的API域A.

我已经使用了位于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。

有什么建议吗?

回答

0

我认为这是同样的问题在这里

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

我回顾proxy.php脚本,并没有发现对JSON内容类型的任何标题。如此反复: 您可以使用此代码数据类型:“文本”来修复它

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

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

+0

嘿尤金,TY更换您的视图代码! - 我检查过了 - Laravel(包含我的api,服务器端)发送了正确的JSON头文件 - 我检查了它,直接在浏览器中查看响应。问题是代理脚本,我相信它会将标题更改为“text/html” - 现在,我已将dataTpe文本添加到我的主干模型,但它仍然不起作用 –

+0

我必须配置代理脚本并添加服务器的URL,以便脚本允许它。现在,我使用正确的标题获得有效的JSON响应,但Backbone的成功回调不会触发。这真的很奇怪。有任何想法吗? –

+0

我没有想法,在这种情况下,我使用调试器:-) –

0

首先你需要在你的模型中删除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"); 
    } 
}, {}); 
+0

Ty Dato' - 从我所看到的,基本上我会通过集合而不是模型来保存 - 为什么你认为它会工作?你能解释你的答案,为什么它是不同的? –

+0

,因为本网站上的这个教程是这么说的:) http://backbonetutorials.com/ –