2013-11-13 3 views
30

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

Вот сценарий, который я использую для выполнения POST, он в настоящее время не запускается, если я не поместил строку в поле данных. Есть идеи?

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

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

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

ответ

40

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

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

By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send a DOMDocument, or other non-processed data, set this option to false.

... но это только часть всей истории: XMLHttpRequest.send реализация имеет свой собственный restrictions. Вот почему ваш лучший выбор, я полагаю, это сделать свой собственный сериализатор с помощью 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); 
+0

Я получаю 'ArrayBuffer устарел в XMLHttpRequest.send(). Вместо этого используйте ArrayBufferView. ', Но затем получите 'ReferenceError: ArrayBufferView не определен' – Musa

+0

Да, я переписал это, чтобы не использовать' ArrayBuffer'; typedArray фактически поддерживаются как браузером Chrome, так и Firefox как параметр «xhr.send». – raina77ow

+0

Спасибо! Я совершенно новый для javascript, поэтому я думал, что было что-то простое, что я отсутствовал. Ваше объяснение определенно пошло выше и дальше. Благодаря! – user2984509

6

Вы можете отправить двоичные данные через 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

+0

+1, но это фактически отправляет байты в обратном порядке.) – raina77ow

+0

Ну, я не думал об этом как о последовательности байтов, а как о u32 int. – Musa

0

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

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

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

Смежные вопросы