IE11 XMLHttpRequest не получают полные данные с сервера - PullRequest
0 голосов
/ 31 марта 2019

Я сейчас работаю над веб-приложением и столкнулся со странной проблемой.Запрос, который я отправляю в приложение-колбу из Google Chrome и Firefox с XMLHttpRequest, работает, как и предполагалось, но в 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 , но в IE нет типа ответа, и ответ обрезается, если он слишком длинный: Ответ IE

Я не знаюбудь то проблема с колбой или то, как IE обрабатывает запрос, возможно, мне нужно добавить несколько заголовков в проект колбы, но я не знаю.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Я немного изменил код на стороне сервера и на стороне клиента и заставил сервер отправлять данные 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."})

Может быть, это просто проблема с флягой jsonify, с тем, как колба обрабатывает ответы, или с тем, как IE обрабатывает запросы, я не знаю, у меня была возможность отредактировать сервер, поэтому я пошел по этому пути.

0 голосов
/ 31 марта 2019

Используйте ActiveXObject объекты вместо XMLHttpRequest для старых IE:

if (window.XMLHttpRequest) {
    // code for modern browsers
    xmlhttp = new XMLHttpRequest();
 } else {
    // code for old IE browsers
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} 

Я не уверен, что вышеуказанное решит проблему, потому что у вас уже есть IE11 (более новая версия) . Почему бы вам не попробовать AJAX-вызов с использованием JS-фреймворков и посмотреть, не возникает ли такая же проблема.

Я бы сказал, вместо использования XMLHttpRequest(), используйте любую инфраструктуру / библиотеку JS для вызова AJAX вашей конечной точки REST фляги, потому что структуры / библиотеки JS позаботятся о подобных проблемах с IE. Например JQuery , AngularJS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...