Bonjour,

Je recherche à récupérer correctement un flux binaire via ajax comme ceci :


function cool() {  
var buffer = msgpack.encode(0);
$.ajax({
  url: "/reply",
  type: "POST",
  data: buffer,
  //dataType: 'binary',
  headers:{'Content-Type':'application/msgpack'},
  processData: false
}).done(function(response) {
    debugger;
  });
}


Quand je regardes ma réponse dans l'onglet network de chrome, j'ai bien ce que j'attends : Â en UTF8 ce qui correspond à
C3
en hexa =>
195
et
true
pour mesgpack.

Seulement, dans la réponse de ma requète, j'ai la valeur 0xfffd : je n'y comprend rien.
Modifié par moths-art (03 Jun 2017 - 10:13)
Bon, si je comprend bien : le navigateur interprète le flux sous la forme d'un texte en utf-8 et tout ce qu'il n'arrive pas à interprété, est converti en 0xfffd.

Et Jquery ne traite pas (ou mal) les flux binaires : si vous avez des extensions ou autres libs (genre axios) qui font bien le job, je suis preneur.
Bon, j'ai fini par arriver à mes fins avec la librairire axios (jquery n'est vraiment pas adapté au format binaire...)

Je communique le code (ça servira peut-être à quelqu'un) :

function recupereFlux() {
var buffer = msgpack.encode(0);
  axios.post(
    '/reply', buffer,
    {
      responseType: 'blob',
      headers: {'Content-Type': 'application/msgpack; charset=utf-8'}
    }
  ).then(function(response) {
    var reader = new FileReader();
    reader.onload = function (e) {
        var pack = msgpack.decode(new Uint8Array(reader.result));
        console.log(pack);
    }
    reader.readAsArrayBuffer(response.data);
  });
}
}


Dedans, je précise bien que j'attend du binaire (responseType: 'blob'), je dois convertir le blob récupéré en un tableau d'entier Uint8Array à travers l'objet FileReader.
Et ce n'est qu'à ce moment que je peux décoder mon flux via msgpack-lite afin de le transformer en un objet javascript.

C'étais loin d'être triviale donc je partage. (la doc à ce sujet étant très éparse)