Ответ 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);