2012-09-05 63 views
3

我已經寫了發送從客戶端瀏覽器寫在PHP我們的API跨域POST請求JavaScript方法:jQuery的AJAX POST請求丟棄的身體在IE9

$.ajax({ 
    type:  'POST', 
    url:  backend_url, 
    data:  postArgs, 
    beforeSend: function(xhr, settings) { 
     xhr.setRequestHeader('Connection', 'close'); 
    }, 
    error:  function(xhr, status, errorThrown) { 
     console.log('RECONTRIBUTION: Error on AJAX request! status=' + status + ', errorThrown=' + errorThrown + ', statusText=' + xhr.statusText); 
     $('#alert_message').showAlertMsg('error', 'Oops, we couldn\'t talk to our server! Please try again in a moment.'); 
    }, 
    success: function(data, status, response) { 
     //do things 
    } 
}); 

在一切的偉大工程Firefox,Chrome和Safari,但在IE9中,我遇到了問題。第一個問題是我得到了一個「無傳輸」錯誤,我認爲這是由於IE對跨域請求的限制造成的。我通過將jQuery.support.cors設置爲true幷包含此插件(通過在不同的SO線程中找到該插件)得到了請求:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/jQuery.XDomainRequest.js

現在請求已完成,但API返回錯誤,因爲請求正文是失蹤。從鉻

工作請求(網址刪節):

POST [backendurl] HTTP/1.1 
Host: [backendurl] 
Connection: keep-alive 
Content-Length: 79 
Origin: [frontendurl] 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Accept: */* 
Referer: [frontendurl] 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
DNT: 1 

action=contributeSong&client=TUNEBOT&iTunes_id=17344380&user_id=&query_id=64600 

而且從IE9非工作請求:

POST [backendurl] HTTP/1.1 
Accept: */* 
Origin: [frontendurl] 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host: [backendurl] 
Content-Length: 0 
Connection: Keep-Alive 
Pragma: no-cache 

怪異的部分是,我試圖設置連接頭到關閉因爲我讀到Keep-Alive有時會導致Internet Explorer出現問題......但請求仍然會發送Connection:Keep-Alive。有任何想法嗎?我已經把頭髮撕了幾天。好吧,所以在做了一些關於XDR對象的更多閱讀後,我意識到我無法發送定製頭文件,這解釋了Keep-Alive問題。我看了一下插件,它沒有發送任何數據到服務器(...),所以現在我已經請求APPEARS發送數據,但仍然得到相同的響應...

POST [backendurl] HTTP/1.1 
Accept: */* 
Origin: [frontendurl] 
Accept-Language: en-US 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host: [backendurl] 
Content-Length: 79 
Connection: Keep-Alive 
Pragma: no-cache 

action=contributeSong&client=TUNEBOT&iTunes_id=23148795&user_id=&query_id=64612 

如下所示,添加cache:false選項似乎不影響任何內容。是Connection:Keep-Alive這裏有什麼讓我難過的?

回答

1

修正了它!我下載的IE9 XDR插件在執行XDR請求時沒有向服務器發送任何數據,因此我將數據添加到請求中,並根據需要修改了我的API以解析$ HTTP_RAW_POST_DATA變量。真是太痛苦了,我希望IE10和它的發展一樣具有革命性......

+2

您能否介紹一下如何添加請求的數據?它看起來像你使用的插件傳遞數據...我使用$ postdata = file_get_contents(「php:// input」);以獲得原始的POST數據,但它可以工作,但我希望能夠像我在其他地方一樣使用$ _POST – ashgromnies

+0

您是否可以將您的代碼作爲此答案的一部分來幫助其他人? – ClearCloud8

1

試試這個:只要你打電話給你的$().ready(function() { - 確保設置此:

$.ajaxSetup({ cache: false }); 

這避免了通過IE試圖成爲智能引起了問題。

+0

根據Fiddler的說法,似乎沒有什麼幫助 - 沒有改變傳出的請求。任何其他想法?它可能與我必須下載的CORS插件有關,以便首先完成請求? 我也很懷疑Connection頭沒有改變......但是我不完全知道如何弄清楚我的beforeSend更改在哪裏被丟棄...... – dmajoraddnine