3

クライアント側のブラウザからPHPで記述されたAPIにクロスドメインPOSTリクエストを送信するJavascriptメソッドを作成しました。

$.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はエラーを返します。

Chromeからの作業リクエスト(URLは編集済み):

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ヘッダーをCloseに設定しようとしたことです...しかし、リクエストはとにかく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ここで私を殺しているのは何ですか?

4

2 に答える 2

1

これを試してください:あなたがあなたに電話したらすぐに$().ready(function() {-これを設定することを忘れないでください:

$.ajaxSetup({ cache: false });

これにより、IEがスマートになろうとすることによって引き起こされる問題を回避できます。

于 2012-09-05T21:07:15.237 に答える
1

修正しました!ダウンロードしたIE9XDRプラグインは、XDRリクエストの実行時にサーバーにデータを送信していなかったため、リクエストにデータを追加し、必要に応じて$HTTP_RAW_POST_DATA変数を解析するようにAPIを変更しました。なんて痛いことでしょう。IE10がそれが実現したのと同じくらい革新的であることを願っています...

于 2012-09-06T17:28:03.673 に答える