Envoyer des pieces jointes à un service web avec MTOM

Je vais essayer de décrire l’ajout d’une pièce jointe à un message SOAP via l’API JAX-WS.

SOAP 1.2 permet d’envoyer à l’instar des mails des documents en pièce jointe d’un flux SOAP.

Ils peuvent être binaires ou tout simplement texte (ex. flux XML). Les flux binaires sont par défaut mis dans le message SOAP et encodé en base64. Ce qui augmente la taille du message d’environ 30% par rapport au flux binaire original….

Exemple de flux binaire encodé en base64:

<S:Envelope xmlns:S= »http://schemas.xmlsoap.org/soap/envelope/ »>

</S:Envelope>

On peut donc ajouter une pièce jointe dans un flux grâce à la classe DataHandler. Celle-ci fournit les mécanismes de sérialisation et de gestion des types MIME.

L’ API permet également d’utiliser d’autres classes plus spécifiques : (ex.: la classe Image pour pour les images png et jpg)

Exemple:

Ici nous renvoyons dans un flux SOAP un fichier binaire.

Nous pouvons voir dans SOAPUI que les données binaires renvoyées sont encodées en base64 et mises directement dans le flux XML. Pour que ces dernières soient réellement en pièce jointe, on peut: gérer les pièces jointes manuellement en utilisant la classe SOAPMessageContext dans un handler

ou tout simplement utiliser MTOM. Ce mécanisme permet d’envoyer le flux binaire dans sa forme originale et nous éviter l’encodage en base64….

Pour activer MTOM sur notre service il faut simplement ajouter l’annotation @MTOM

Et voila la requête générée :

et la réponse

On peut voir que le message SOAP n’indique qu’une référence à la pièce jointe ( un peu comme les images inclus dans un mail HTML) et non le flux en base 64.

Le résultat vu par SOAPUI: ScreenShot001.png

Ressources

Un article intéressant sur le site d’IBM

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *