クライアント側のブラウザから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
ここで私を殺しているのは何ですか?