ネットワーク上のデバイスにHTTP POSTを送信しようとしています。残念ながら、デバイスに4バイトのデータを送信したいのですが、デバイスに文字列しか送信できないようです。 。javascriptを使用して生のバイナリを送信する方法はありますか?
POSTを実行するために使用しているスクリプトは次のとおりです。現在、データフィールドに文字列を入力しない限り実行されません。何か案は?
(function ($) {
$.ajax({
url: '<IP of Address>',
type: 'POST',
contentType: 'application/octet-stream',
//data:'253,0,128,1',
data:0xFD008001,
crossDomain: true
});
})(jQuery);
デフォルトでは、jQueryはデータをシリアル化し(data
プロパティで渡されます)-0xFD008001
numberが '4244668417'としてサーバーに渡されることを意味しますstring(10バイト、4ではない)、サーバーがそれを期待どおりに処理しない理由です。
$.ajax
プロパティprocessData
をfalse
に設定して、このような動作を防ぐ必要があります。
デフォルトでは、オブジェクト(技術的には文字列以外)としてデータオプションに渡されたデータは処理され、デフォルトのコンテンツタイプ「application/x-www-form-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);
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
ArrayBuffer型のデータを、次のようにArrayBufferViewに変換できます。
var fileContent = new DataView(<ArrayBuffer_data>);
これを使用すると、fileContentを送信するときにコンソールで警告が表示されなくなります。
atob()
およびbtoa()
を使用できます。
var data = new Uint32Array(1);
data[0] = 0xFD008001;
atob(data)
これにより、バイナリデータがテキストとして送信可能なbase64文字列に変換されます。