web-dev-qa-db-ja.com

HTTP経由でJavaScriptのバイナリデータを送信する

ネットワーク上のデバイスに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);
34
user2984509

デフォルトでは、jQueryはデータをシリアル化し(dataプロパティで渡されます)-0xFD008001numberが '4244668417'としてサーバーに渡されることを意味しますstring(10バイト、4ではない)、サーバーがそれを期待どおりに処理しない理由です。

$.ajaxプロパティprocessDatafalseに設定して、このような動作を防ぐ必要があります。

デフォルトでは、オブジェクト(技術的には文字列以外)としてデータオプションに渡されたデータは処理され、デフォルトのコンテンツタイプ「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);
47
raina77ow

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

7
Musa

ArrayBuffer型のデータを、次のようにArrayBufferViewに変換できます。

var fileContent = new DataView(<ArrayBuffer_data>);

これを使用すると、fileContentを送信するときにコンソールで警告が表示されなくなります。

0
Jonny

atob()およびbtoa()を使用できます。

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

これにより、バイナリデータがテキストとして送信可能なbase64文字列に変換されます。

0
Sohail Si