处理原始JavaScript返回到.ajax错误函数,尽管200 OK

时间:2013-03-20 17:08:27

标签: javascript jquery post

我正在对我无法控制的产品进行以下jQuery.ajax()调用:

$.ajax({
    type: "POST",
    url: "/WfWsR",
    data: { method: 'getInfo',
        nodeID: nodeID
    },
    dataType: "text",
    success: function(data, response, replyxhr){
        return data;
    },
    error: function(replyxhr, response){
        console.log(response);
        console.log(replyxhr);
        return response;
    }
});

POST以200 OK成功,但不是进入成功函数,而是以错误结束,响应变量设置为“error”,并且replyxhr变量设置为Object {readyState = 0,status = 0,状态文本= “错误”}。

通过Postman手动尝试POST会产生结果:

new Array(
  new Array(
    new Array(
      "15", "1", ""
    )
  ), 
  new Array(
    new Array(
      "1", "3757", "3757", "user", "2013-01-22 15:09:04.354"
    )
  ), 
  new Array(
  ), 
  new Array(
    "3762", "ABCD", "test Purge Documents", "50", "purge Documents", "Administrator", "2013-01-22 15:07:57.065"
  ), "13d886ddf90"
)

这是很多JavaScript;从技术上讲,我只需要任何一个阵列中的一个项目。我认为它不适用于jQuery的原因是因为这种返回可能是无效的,特别是在dataType:“text”的情况下。但我不能使用dataType:“script”;它使用隐式GET而不是POST,并且有问题的URL不支持GET。

我还缺少其他选择吗?

2 个答案:

答案 0 :(得分:0)

根据响应的text,我会猜测你告诉Ajax期待content-type,但它正在得到别的东西。服务器似乎正在为您提供Javascript,因此如果内容类型为text/javascript,我不会感到惊讶。

我从来没有处理过这个,但如果这是你的问题,那么文档确实说jQuery 1.5及更高版本中有一个解决方案:

  

多个空格分隔的值:从jQuery 1.5开始,jQuery可以转换   从Content-Type标头中收到的数据类型到什么   你需要。例如,如果您希望将文本响应视为   XML,使用“text xml”作为dataType。你也可以制作一个JSONP   请求,将其作为文本接收,并由jQuery解释为XML:   “jsonp text xml。”同样,一个简写字符串,如“jsonp xml”   将首先尝试从jsonp转换为xml,如果失败,   从jsonp转换为文本,然后从text转换为xml。

通过http://api.jquery.com/jQuery.ajax/(请参阅docType for dataType)

这意味着你可以使用它:dataType: "script text"将Javascript响应解释为文本。当然,您也可以使用dataType: "script"将其解释为脚本。

答案 1 :(得分:0)

结束编写我自己的xhr调用(没有错误处理)来允许这个。解决一个可怕问题的可怕方案。 (eval()的双重失败。)

var xhReq = new XMLHttpRequest();
var params = "method=getInfo&nodeID=" + nodeID;

xhReq.open("POST", "/WfWsR", true);
xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhReq.onreadystatechange = onPostSubmit;
xhReq.send(params);
var response = eval(xhReq.response);
var stepIDx = response[0][0][0];

return stepIDx;

function onPostSubmit() {
    if (xhReq.readyState==4 || xhReq.readyState=="complete") { 
        if (xhReq.status != 200) {
            alert('BadStatus');
            return;
        }
    }
}