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);
Par défaut, jQuery sérialise les données (transmises dans la propriété data
) - et cela signifie que 0xFD008001
numé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);
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
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.