调试时使用的是火狐浏览器 参数填写完成启动后,报长轮询错误
XML 解析错误:格式不佳
检查返回结果,请求是成功了的。询问腾讯相关技术支持,得出结果是,这种错误并不影响正常使用,不用理会。
但!强迫症告诉我,这种错误不允许存在。
这是火狐浏览器的一个坑,火狐浏览器默认的解析方式是html,而回复头上没有指定json,导致使用html解析出现问题。
事实上,腾讯提供的sdk中有相应的处理方法,找到webim.js
//发起ajax请求
var ajaxRequest = function (meth, url, req, timeout, content_type, isLongPolling, cbOk, cbErr) {
var xmlHttpObj = getXmlHttp();
var error, errInfo;
if (!xmlHttpObj) {
errInfo = "创建请求失败";
var error = tool.getReturnError(errInfo, -1);
log.error(errInfo);
if (cbErr) cbErr(error);
return;
}
//保存ajax请求对象
xmlHttpObjSeq++;
xmlHttpObjMap[xmlHttpObjSeq] = xmlHttpObj;
xmlHttpObj.open(meth, url, true);
xmlHttpObj.onreadystatechange = function () {
if (xmlHttpObj.readyState == 4) {
xmlHttpObjMap[xmlHttpObjSeq] = null; //清空
if (xmlHttpObj.status == 200) {
if (cbOk) cbOk(xmlHttpObj.responseText);
xmlHttpObj = null;
curLongPollingRetErrorCount = curBigGroupLongPollingRetErrorCount = 0;
} else {
xmlHttpObj = null;
//避免刷新的时候,由于abord ajax引起的错误回调
setTimeout(function () {
var errInfo = "请求服务器失败,请检查你的网络是否正常";
var error = tool.getReturnError(errInfo, -2);
//if (!isLongPolling && cbErr) cbErr(error);
if (isLongPolling && onLongPullingNotify) {
onLongPullingNotify(error);
}
if (cbErr) cbErr(error);
}, 16);
}
}
};
xmlHttpObj.setRequestHeader('Content-Type', content_type);
//设置超时时间
if (!timeout) {
timeout = ajaxDefaultTimeOut; //设置ajax默认超时时间
}
if (timeout) {
xmlHttpObj.timeout = timeout;
xmlHttpObj.ontimeout = function (event) {
xmlHttpObj = null;
//var errInfo = "请求服务器超时";
//var error = tool.getReturnError(errInfo, -3);
//if (cbErr) cbErr(error);
};
}
//
if (xmlHttpObj.overrideMimeType) {
// xmlHttpObj.overrideMimeType("application/json;charset=utf-8");
}
xmlHttpObj.send(req);
}
这是长轮询发起请求的位置,发现其中注释掉的一行
// xmlHttpObj.overrideMimeType("application/json;charset=utf-8");
去掉注释,问题解决,挺坑,有这个解决方法,但是相关技术支持却并没有告诉我这点