2014-03-29 67 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/ –