我目前正在开发Web应用程序,但遇到一个奇怪的问题。我使用XMLHttpRequest从Google Chrome和Firefox发送到我的Flask应用程序的请求按预期工作,但在IE11和可能的较旧版本中,IE似乎在数据完全传输之前关闭了连接。我发送这样的发帖请求:
function getData() {
var req = new XMLHttpRequest();
req.open("POST", "http://"+window.host+"/text", true);
req.responseType = "json";
req.addEventListener("readystatechange", function(e){
if (e.target.readyState == 4 && e.target.status == 200){
display(e.target.response.data);
}
});
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(JSON.stringify({"text": "some text"}));
}
并从烧瓶应用程序接收如下消息:
@app.route('/text', methods=["POST"])
def data():
if request.is_json:
if "text" in request.get_json():
for i in request.get_json()["text"]:
if not re.search(textIntegrity, i):
return jsonify({"status": "Unrecognized characters: {}.".format(i)})
break
data = reData(request.get_json()["text"])
return jsonify({"status": 200, "data": data})
else:
return jsonify({"status": "Key 'text' not found."})
else:
return jsonify({"status": "Request type is not in json format."})
在mozilla和firefox中,我得到了完整的数据,并且XMLHttpRequest对象声明响应类型为json:Mozilla Response,但在IE中没有响应类型,如果响应时间太长,则响应被剪切: IE Response
我不知道是烧瓶问题还是IE处理请求的方式,也许我需要向烧瓶项目添加一些标头,但我不知道。
答案 0 :(得分:0)
对于较旧的IE,使用ActiveXObject
对象而不是XMLHttpRequest
:
if (window.XMLHttpRequest) {
// code for modern browsers
xmlhttp = new XMLHttpRequest();
} else {
// code for old IE browsers
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
我不确定以上内容是否可以解决问题,因为您已经拥有 IE11(较新版本)。为什么不尝试使用JS框架进行AJAX调用,看看是否遇到相同的问题。
我会说,不要使用XMLHttpRequest()
,而应使用任何JS框架/库对烧瓶REST端点进行AJAX调用,因为JS框架/库将解决IE中的此类问题。例如 JQuery , AngularJS 。
答案 1 :(得分:0)
我最终稍微更改了服务器端代码和客户端代码,并使服务器将json数据作为字符串发送并在客户端进行解析。
function getData() {
var req = new XMLHttpRequest();
req.open("POST", "http://"+window.host+"/text", true);
req.addEventListener("readystatechange", function(e){
if (e.target.readyState == 4 && e.target.status == 200){
display(JSON.parse(e.target.response));
}
});
req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
req.send(JSON.stringify({"text": "some text"}));
}
@app.route('/text', methods=["POST"])
def data():
if request.is_json:
if "text" in request.get_json():
for i in request.get_json()["text"]:
if not re.search(textIntegrity, i):
return jsonify({"status": "Unrecognized characters: {}.".format(i)})
break
data = reData(request.get_json()["text"])
return json.dumps(data);
else:
return json.dumps({"status": "Key 'text' not found."})
else:
return json.dumps({"status": "Request type is not in json format."})
这可能只是关于flask jsonify的问题,flask处理响应的方式或IE处理请求的方式,我不知道,我有机会编辑服务器,所以我采用了这种方式。