2014-02-09 63 views
2

我的應用程序目前可以通過標準的JQuery Ajax GET請求來訪問我們的API,並獲取良好的數據。據我所見,CORS已經在遠程服務器上正確實施。下面是響應頭:請幫我理解Ajax請求與Backbone fetch()

company_client_envelope_id: 88764736-6654-22e4-br344-a1w2239a892d 
access-control-allow-headers: X-Requested-With, Cookie, Set-Cookie, Accept, Access-Control 
Allow-Credentials, Origin, Content-Type, Request-Id , X-Api-Version, X-Request-Id,Authorization, COMPANY_AUTH_WEB 
access-control-expose-headers: Location 
response-time: 55 
request-id: 88764736-6654-22e4-br344-a1w2239a892d 
company_api_version: 0.01.09 
server: localhost 
transfer-encoding: chunked 
connection: close 
access-control-allow-credentials: true 
date: Sun, 09 Feb 2014 14:44:05 GMT 
access-control-allow-origin: * 
access-control-allow-methods: GET, POST 
content-type: application/json 

但是,使用骨幹,並呼籲通過獲取(相同GET請求)導致以下CORS錯誤:

No 'Access-Control-Allow-Origin' header is present on the requested resource. 

我想不出有什麼區別。這兩個請求都從本地主機運行。

headers: { 
    "accept":"application/json" 
} 

和模型和收集聲明的情況下,我發出像這樣的標題:

在AJAX查詢的情況下,通過API傢伙,請求被髮送以下

MyApp.someCollection = Backbone.Collection.extend(

    { 
     model:MyApp.someModel, 
     headers: { 
     'Accept':'application/json', 
     'withCredentials': 'true' 
    }, 

    url: MYCOMPANY_GLOBALS.API + '/endpoint' 
}); 

和我的獲取很簡單:

someCollection.fetch(); 

============================== = 添加響應於:@ddewaele

這些是從網絡選項卡中的標頭:

Request URL:http://api-blah.com:3000/ 
Request Headers CAUTION: Provisional headers are shown. 
Accept:application/json 
Cache-Control:no-cache 
Origin:http://localhost 
Pragma:no-cache 
Referer:http://localhost/blah/blah/main.html 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107Safari/537.36 

沒有預飛行或遠程標頭從API服務器:

許多感謝,

+0

您可以發佈chrome開發工具(網絡選項卡)的請求和響應頭文件嗎?對於jquery和backbone都可以使用pre-flight OPTIONS調用和隨後的GET調用。 – ddewaele

+0

@ddewaele 上面添加了額外的頭信息。 (對不起,如果你有很多通知 - 我試圖找出在StackOverflows系統中添加代碼的正確方法時遇到問題 – Wittner

+0

也剛剛注意到開發工具的網絡選項卡中的狀態(取消) – Wittner

回答

0

我向你推薦

Wittner改寫Backbone.sync方法,因爲在你的應用程序,你有一些EXA安全領域等等原因。

var oldBackboneSync = Backbone.sync; 
    // Override Backbone.Sync 
    Backbone.sync = function (method, model, options) { 
    if (method) { 
     if (options.data) { 
     // properly formats data for back-end to parse 
     options.data = JSON.stringify(options.data); 
     } 
     // transform all delete requests to application/json 
     options.contentType = 'application/json'; 
    } 
    return oldBackboneSync.apply(this, [method, model, options]); 
    } 

您可以根據需要添加不同的標題。