0

ASP.NET で動作している単純な Ajax 呼び出しを実行していますが、onreadystatechange 関数内にブレークポイントを配置すると、奇妙な DOM 例外で失敗します。たとえば、Google Chrome で xmlhttp 変数を調べたときに、PHP が失敗しているために ASP.NET が行っている余分なヘッダー マジックとは何ですか。

var xmlhttp;
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange = function () {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        //Here is where you unwrap the data
        var arr = UnWrapVars(xmlhttp.responseText);
        if (callBackFunc) {
            callBackFunc(arr);
        }
    }
};
xmlhttp.open("POST", ajaxURL, true);
if (navigator.userAgent.toLowerCase().indexOf('msie') == -1) {
    xmlhttp.overrideMimeType("application/octet-stream");
}
xmlhttp.send("[FunctionName]" + functionName + "[/FunctionName][CanvasID]" + canvasid + "[/CanvasID][WindowID]" + windowid.toString() + "[/WindowID][Vars]" + getEncodedVariables() + "[/Vars]");

Ajax ページからの受信データは次のようになります: [root][Vars][windows]

< ではなく [ を意図的に実行しているので、それを指摘しないでください。また、ASP.NET ページからは機能しますが、PHP ページからは機能しません。返されるデータは、サーバー側で確認したものと同じです。では、ASP.NET が PHP が行っていないことを行っている場合、不足しているヘッダー マジックは何でしょうか。

4

1 に答える 1

0

これは、$_POST実際には、フォームから投稿されたデータにアクセスするための省略形であるためです。適切なヘッダーが必要です。次の行を の前に置きますxmlhttp.send()

xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

$_POSTこれにより、PHP は配列にデータを入力するよう強制されます。

または、ストリームRequestのカスタム ラッパーとして機能するインスタンスを作成することもできます。php://inputそうすれば、XHR 呼び出しで追加のヘッダーを送信する必要がなくなります。

于 2012-08-19T08:35:17.687 に答える