2016-01-29 21 views
0

這裏是我的Ajax調用:jQuery的阿賈克斯不發送Accept頭

function fetchAccount(email, callback) { 
    $.ajax({ 
    url: "http://example.com/", 
    jsonp: "callback", 
    dataType: 'jsonp', 
    type: 'GET', 
    async: false, 
    headers: {"Accept" : "application/javascript; charset=utf-8"}, 
    success: function(data) { 
     appState.user = data; 
     appState.viewState = AppStates.CONTENT_VIEW; 
     AppStore.persistToLocalStorage(); 
     callback();  
    }, 
    error: function(xhr, status, err) { 
     appState.user = ""; 
     appState.viewState = AppStates.LOGIN_FAIL_VIEW; 
     AppStore.persistToLocalStorage(); 
     callback(); 
    }  
    }); 
}; 

我的心不是服務器返回JSONP因爲接受頭實際上沒有正確設置。當我使用「修改標題」谷歌瀏覽器擴展名手動注入「接受」「應用程序/ JavaScript的;字符集= utf-8」服務器響應JSONP就好了。

我拍攝的請求頭,並如預期,「接受」被正確設置的心不是:

GET /api/accounts/[email protected]?callback=jQuery22009572079558856785_1454040030107&_=1454040030108 HTTP/1.1 
Host: www.example.com 
Connection: keep-alive 
Accept: */* 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,et;q=0.6 

這是怎麼回事 - 我怎樣才能得到它正確設置accept頭?這似乎很簡單...

回答

0

當您請求JSONP您正在要求發回一個腳本來執行您正在給它的回調。腳本的正確接受標題爲application/javascript而不是application\json。在我看來,你的服務器是錯誤的,而不是jQuery。也就是說,您可以嘗試將AJAX設置中的accepts屬性設置爲application/json,然後查看是否有效。我認爲這不應該是必要的,即使它有效,我也不會推薦它;我建議你儘可能修復服務器。

jQuery,ajax API docs

如果指定了JSONP是,$。阿賈克斯()將自動追加(默認)回調的查詢字符串參數=?到URL。傳遞給$ .ajax()的設置的jsonp和jsonpCallback屬性可分別用於指定查詢字符串參數的名稱和JSONP回調函數的名稱。服務器應該返回傳遞JSON響應的有效JavaScript到回調函數中。在將包含在響應中的JSON對象傳遞給$ .ajax()成功處理函數之前,$ .ajax()將執行返回的JavaScript,調用JSONP回調函數。

+0

糟糕,我試圖解決這個問題,並從interwebs複製一個壞榜樣。這是正確的內容類型,它仍然失敗......見上面 – Patrick

+0

@Patrick你確定你需要JSONP,而不是JSON。如果您向與網頁相同的域中的服務器發出請求,則應該使用普通的JSON。 JSONP是避開跨源策略的較早方式。如果支持的話,今天更好的方法是使用CORS。但是,如果服務器位於同一個域中,則不需要執行任何操作。 – tvanfosson

+0

服務器在這裏很好 - 我正在申請application/json並獲得它。糾正它後,應用程序/ JavaScript我仍然得到相同的結果。 – Patrick