Подтвердить что ты не робот

Отправка двоичных данных в javascript через HTTP

Я пытаюсь отправить HTTP POST на устройство в своей сети. Я хочу отправить четыре конкретных байта данных на устройство, к сожалению, я только могу отправить строки на устройство. Есть ли в любом случае отправить сырые двоичные файлы с помощью javascript?

Здесь script, который я использую для выполнения POST, он в настоящее время не выполняется, если я не поместил строку в поле данных. Любые идеи?

(function ($) {
   $.ajax({
      url: '<IP of Address>',
      type: 'POST',
      contentType: 'application/octet-stream',

      //data:'253,0,128,1',
      data:0xFD008001,

      crossDomain: true
   });
})(jQuery);
4b9b3361

Ответ 1

По умолчанию jQuery сериализует данные (переданные в свойстве data) - и это означает, что число 0xFD008001 передается серверу как строка "4244668417" (10 байтов, а не 4), поэтому сервер обрабатывает его не так, как ожидалось.

Необходимо предотвратить такое поведение, установив $.ajax свойство processData в false:

По умолчанию данные передаются в параметр данных как объект (технически, ничего, кроме строки) будет обработано и преобразуется в строку запроса, подстраиваясь под тип содержимого по умолчанию "Применение/х-WWW-форм-urlencoded". Если вы хотите отправить DOMDocument или другие необработанные данные, установите для этого параметра значение false.

... но что только часть всей истории: XMLHttpRequest.send реализация имеет свои собственные ограничения. Вот почему, на ваш взгляд, лучше всего сделать свой собственный сериализатор с помощью TypedArrays:

// Since we deal with Firefox and Chrome only 
var bytesToSend = [253, 0, 128, 1],
    bytesArray = new Uint8Array(bytesToSend);

$.ajax({
   url: '%your_service_url%',
   type: 'POST',
   contentType: 'application/octet-stream',  
   data: bytesArray,
   processData: false
});

Или без использования jQuery вообще:

var bytesToSend = [253, 0, 128, 1],
    bytesArray = new Uint8Array(bytesToSend);

var xhr = new XMLHttpRequest();
xhr.open('POST', '%your_service_url%');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.send(bytesArray);

Ответ 2

Вы можете отправлять двоичные данные через ajax с помощью xhr2, вы можете отправлять данные в виде типизированного массива или blob.

(function ($) {
   var data = new Uint32Array(1);
   data[0] = 0xFD008001; 
   $.ajax({
      url: '<IP of Address>',
      type: 'POST',
      contentType: false,
      processData: false,
      //data:'253,0,128,1',
      data:data,

      crossDomain: true
   });
})(jQuery);

https://developer.mozilla.org/en-US/docs/Web/API/Uint32Array

Ответ 3

Вы можете использовать atob() и btoa():

var data = new Uint32Array(1);
data[0] = 0xFD008001;
atob(data)

Это преобразует ваши двоичные данные в строку base64, которая может быть отправлена ​​как текст.