jQuery AJAX POST请求丢弃ie9中的正文

时间:2012-09-05 20:54:51

标签: jquery ajax internet-explorer internet-explorer-9

我编写了一个Javascript方法,它将客户端浏览器的跨域POST请求发送到我们用PHP编写的API:

$.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中我遇到了问题。第一个问题是我得到了一个" No Transport"我认为错误是由于IE对跨域请求的限制造成的。我通过将jQuery.support.cors设置为true并通过包含此插件获得了请求,该插件位于不同的SO线程上:https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/blob/master/jQuery.XDomainRequest.js

现在请求完成,但API返回错误,因为缺少请求正文。

Chrome的工作请求(网址已编辑):

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

奇怪的是,我试图将Connection标头设置为Close,因为我读到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在这里杀了我什么?

2 个答案:

答案 0 :(得分:1)

试试这个:只要你打电话给$().ready(function() { - 请务必设置:

$.ajaxSetup({ cache: false });

这可以避免因IE尝试变聪明而导致的问题。

答案 1 :(得分:1)

修正了它!我下载的IE9 XDR插件在执行XDR请求时没有向服务器发送任何数据,因此我将数据添加到请求中并修改了我的API以根据需要解析$ HTTP_RAW_POST_DATA变量。真是太痛苦了,我希望IE10能像革命那样具有革命性......