0

我正在做一个简单的 Ajax 调用,该调用在 ASP.NET 中工作,但是当您在 onreadystatechange 函数中放置断点时,由于一些奇怪的 DOM 异常而失败。例如,当您在 Google Chrome 中查看 xmlhttp 变量时,ASP.NET 正在做的额外的标头魔术是什么,而 PHP 没有做到这一点,导致 PHP 的 responseText 为空白,只有 DOM 异常。

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");

这将强制 PHP 填充$_POST数组。

或者,您可以创建一个Request实例,作为php://input流的自定义包装器。那么您的 XHR 调用将不需要发送额外的标头。

于 2012-08-19T08:35:17.687 回答