web-dev-qa-db-fra.com

Envoi de données binaires en javascript via HTTP

J'essaie d'envoyer un HTTP POST à un périphérique de mon réseau. Je souhaite envoyer quatre octets de données spécifiques au périphérique. Malheureusement, il semble que je ne puisse envoyer que des chaînes au périphérique. Est-il possible d'envoyer des fichiers binaires bruts à l'aide de javascript? 

Voici le script que j'utilise pour faire le POST, il ne s'exécute pas à moins que je mette une chaîne dans le champ de données. Des idées?

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

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

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

Par défaut, jQuery sérialise les données (transmises dans la propriété data) - et cela signifie que 0xFD008001numéro est transmis au serveur sous la forme '4244668417' chaîne (10 octets et non 4), pourquoi le serveur le traite pas comme prévu. 

Il est nécessaire d'empêcher un tel comportement en définissant $.ajax propriété processData sur false:

Par défaut, les données transmises à l'option data en tant qu'objet (techniquement, tout ce qui est autre qu'une chaîne) sera traité et transformé en une chaîne de requête, correspondant au type de contenu par défaut "application/x-www-form-urlencoded". Si vous voulez envoyer un DOMDocument, ou d'autres données non traitées, définissez cette option sur false.

... mais ce n'est qu'une partie de l'histoire: l'implémentation de XMLHttpRequest.send a ses propres restrictions . C'est pourquoi votre meilleur pari, je suppose, est de créer votre propre sérialiseur à l'aide de 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
});

Ou sans utiliser jQuery du tout:

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);
46
raina77ow

Vous pouvez envoyer des données binaires via ajax avec xhr2, vous pouvez les envoyer sous forme de tableau typé ou de 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

Vous pouvez utiliser atob() et btoa():

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

Cela convertit vos données binaires en une chaîne base64 pouvant être envoyée sous forme de texte. 

0
Sohail Si