IE11 XMLHttpRequest无法从服务器接收完整数据

时间:2019-03-31 15:36:47

标签: javascript python flask xmlhttprequest

我目前正在开发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处理请求的方式,也许我需要向烧瓶项目添加一些标头,但我不知道。

2 个答案:

答案 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处理请求的方式,我不知道,我有机会编辑服务器,所以我采用了这种方式。