Как исправить ошибку "net :: ERR_EMPTY_RESPONSE" из JQuery Ajax Post Request? - PullRequest
0 голосов
/ 10 июня 2019

Проблема Я отправляю цвет HSV с помощью почтового запроса Jquery ajax. Цвет HSV (Hue, Saturation и Value) - это целые числа 0-255. Поэтому для H, S и V вместе я посылаю 3 байта, представляющих каждое из их значений. Однако всякий раз, когда один из 3 байтов равен нулю (0), я получаю ошибку «net :: ERR_EMPTY_RESPONSE». Сервер не получает почтовый запрос при возникновении ошибки, а средства разработки показывают остановку 5 с.

Я пытался Я проверил на стороне сервера, и это не проблема. Я немного протестировал с ajax, и каждый раз, когда я ставлю ноль в массиве Uint8Array, независимо от того, равен ли H 0 или S или V. Отправка нулевого байта каждый раз приводит к ошибке. Это не проблема с CORS, потому что сервер правильно обрабатывает предварительную проверку CORS, и запрос данных с ненулевым байтом всегда работает.

Некоторый код"getHSVArray" возвращает массив Uint8Array со значениями HSV в диапазоне 0-255. Chrome и Firefox позволяют передавать типизированные массивы (Uint8Array) в данные XMLHTTPRequest. Полезная нагрузка запроса отправляется в формате UTF-8. Поэтому любые нули записываются как управляющий символ NUL UTF-8, который, как я считаю, вызывает проблему.

$("#sendBtn").click(() => {
     var byteArray = getHSVArray(kendo.parseColor(colorSelected).toHSV());
     // ex. Uint8Array([255, 255, 255]);
     // error ex. Uint8Array([0, 255, 255]); or Uint8Array([255, 0, 255]);
     $.ajax({
        url: "http://192.168.0.25/",
        type: "POST",
        contentType: false,
        data: byteArray,
        processData: false,
        crossDomain: true
     });
});

Я ожидаю Он должен отправлять все 3 байта в обычном режиме, как это происходит, когда все 3 байта HSV являются ненулевыми числами 1-255.

1 Ответ

0 голосов
/ 13 июня 2019

Протокол HTTP допускает только передачу строк.Например, при отправке TypedArray в запросе post он преобразует десятичные дроби 0-255 в массиве в символы.Но байт 0x000000 приводит к нулевому управляющему символу, который вызывает ошибки со строковыми переменными, и процессоры видят его как конец строки.Чтобы обойти эту проблему, мне нужно было выяснить, как передавать байтовые массивы с использованием протокола, более похожего на TCP, который позволяет отправлять прямые байтовые данные.Решением были WebSockets, которые позволяют отправлять TypedArrays в виде 16-байтовых байтов.Они в основном берут Uint8Array из базы 10, с которой вы их инициализировали, конвертируете в базу 16 и отправляете на сервер, на котором размещается веб-сокет.Затем на стороне сервера вы можете просто преобразовать байты обратно в базу 10 и получить входные значения вашего клиента.

...