我正在尝试将HTTP POST发送到网络上的设备。我想向设备发送四个特定字节的数据,遗憾的是我似乎只能将字符串发送到设备。无论如何使用javascript发送原始二进制文件?
这是我用来执行POST的脚本,除非我在数据字段中放入一个字符串,否则它当前不会运行。有什么想法吗?
(function ($) {
$.ajax({
url: '<IP of Address>',
type: 'POST',
contentType: 'application/octet-stream',
//data:'253,0,128,1',
data:0xFD008001,
crossDomain: true
});
})(jQuery);
答案 0 :(得分:46)
默认情况下,jQuery序列化数据(在data
属性中传递) - 这意味着0xFD008001
number 将作为'4244668417'字符串传递给服务器(10个字节,而不是4个),这就是服务器不按预期处理它的原因。
有必要通过将$.ajax
属性processData
设置为false
来阻止此类行为:
默认情况下,数据作为对象传入数据选项 (技术上,除了字符串之外的任何东西)将被处理和 转换为查询字符串,适合默认的内容类型 “应用程序/ x WWW的形式进行了urlencoded”。如果你想发送一个 DOMDocument或其他未处理的数据将此选项设置为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);
答案 1 :(得分:7)
您可以通过带有xhr2的ajax发送二进制数据,您可以将数据作为类型化数组或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
答案 2 :(得分:0)
您可以使用atob()
和btoa()
:
var data = new Uint32Array(1);
data[0] = 0xFD008001;
atob(data)
这会将二进制数据转换为可以作为文本发送的base64字符串。
答案 3 :(得分:0)
您可以像这样将ArrayBuffer类型的数据转换为ArrayBufferView:
var fileContent = new DataView(<ArrayBuffer_data>);
这样,您在发送fileContent时不会在控制台中收到警告。