【问题标题】:IE11 XMLHttpRequest do not receive full data from serverIE11 XMLHttpRequest 未从服务器接收完整数据
【发布时间】:2019-08-21 21:01:41
【问题描述】:

我目前正在开发一个 Web 应用程序,但遇到了一个奇怪的问题。我使用 XMLHttpRequest 从 Google Chrome 和 Firefox 发送到我的烧瓶应用程序的请求按预期工作,但在 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

不知道是flask问题还是IE处理请求的方式,可能我需要在flask项目中添加一些headers但我不知道。

【问题讨论】:

    标签: javascript python flask xmlhttprequest


    【解决方案1】:

    我最终稍微更改了服务器端代码和客户端代码,并让服务器将 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处理请求的方式,我不知道,我有机会编辑服务器所以我就这样去了。

    【讨论】:

      【解决方案2】:

      对于旧版 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 的此类问题。例如 JQueryAngularJS

      【讨论】:

      • 感谢您的提示,我很感激,如果我在项目开始时会使用框架,但我已经完成了 ui 实现,剩下的一切只是获取数据并放置它们。所以我不想为了这个目的添加任何框架。我无法实现 ActiveXObject 的东西,我尝试使用 angular.js,它可以工作,但我不想弄乱我的代码,所以我稍微更改了服务器,最后我将 json 数据作为字符串发送并解析它在客户端。
      • 相同的 UI 也可以工作,只需使用 JQuery 将数据存储在 JS 变量中并用于您的 UI 组件。由于一切都将是 JS,因此您可以在从 HTTP ajax 请求获得响应后使用任何数据或变量。
      • 是的,你是对的,这只是个人的事情,如果有解决方法,我不需要将框架仅用于一个目的,确保我的应用程序将非常轻量级并且不会有任何大量的 javascript 调用、angular.js 或任何框架都会影响加载时间不超过 0.1 秒,但正如我所说,这只是个人的事情。
      猜你喜欢
      • 2012-12-15
      • 2016-07-24
      • 2020-09-17
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      相关资源
      最近更新 更多