2010-02-02 7 views
3

Je programme simple proxy en java:Webservice-client: Utilisez xml-texte brut au lieu de hiérarchie d'objets

  1. Lire fichier XML
  2. Envoyer demande Web Service
  3. Web-Service Lire réponse
  4. réponse en écriture au fichier

Ma première tentative utilise JAXB pour lire le fichier XML et la génération de Java-objets. Ensuite, j'envoie les objets avec JAX-WS (IBM WebSphere). Je reçois la réponse en tant que "ResponseObject" qui est ensuite généré en code XML. J'écris le code XML dans un fichier.

Cette configuration fonctionne bien. Mais ...

Lors de l'envoi des objets Java au WebService, XML est généré, et la réponse contre les objets java. Je n'aurais vraiment pas besoin de ces objets de requête et de réponse. Existe-t-il un moyen d'invoquer directement le WebService avec du texte en clair xml? Et pour lire la réponse en texte brut xml, au lieu de ces objets de réponse?

(laisse supposer les fichiers XML sont toujours valides.)

Merci

+0

Si vous traitez le texte brut, vous n'avez pas besoin JAXB ou JAX-WS. Utilisez simplement une connexion HTTP pour envoyer et recevoir des chaînes. – sfussenegger

+0

Merci sfussenegger. Mais j'ai besoin d'aide pour créer les messages SOAP. Y a-t-il une bibliothèque qui peut gérer le savon? – Synox

Répondre

3

On peut utiliser SAAJ (SOAP avec l'API Pièces jointes pour Java) qui fonctionne à un niveau inférieur à JAX-WS. Je m'attends à ce qu'il utilise moins de ressources système que JAX-WS.

Voir l'exemple suivant (copié à partir users.skynet.be/pascalbotte/rcx-ws-doc/saajpost.htm)

construction Pas plus dynamique du message SOAP cette fois, nous allons utiliser un simple éditeur de texte et tapez le message soap que nous voulons envoyer.

Exemple 1-13. Le message SOAP dans un fichier formated texte: prepared.msg

<SOAP-ENV:Envelope 
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:enc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<SOAP-ENV:Header/><SOAP-ENV:Body> 
    <ans1:readLS xmlns:ans1="http://phonedirlux.homeip.net/types"> 
    <String_1 xsi:type="xsd:string">your message or e-mail</String_1> 
    </ans1:readLS> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Maintenant, le code sera plus court et vous pouvez facilement l'utiliser à des fins de test.

Exemple 1-14. Poster un message SOAP dans un fichier texte, à un service Web en utilisant SAAJ

import javax.xml.soap.SOAPConnectionFactory; 
    import javax.xml.soap.SOAPConnection; 
    import javax.xml.soap.MessageFactory; 
    import javax.xml.soap.SOAPMessage; 
    import javax.xml.soap.SOAPPart; 

    import java.io.FileInputStream; 
    import javax.xml.transform.stream.StreamSource; 

    import javax.xml.transform.TransformerFactory; 
    import javax.xml.transform.Transformer; 
    import javax.xml.transform.Source; 

    import javax.xml.transform.stream.StreamResult; 

    public class Client { 

    public static void main(String[] args) { 

     try { 
// Create the connection 
SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance(); 
SOAPConnection conn = scf.createConnection(); 

// Create message 
MessageFactory mf = MessageFactory.newInstance(); 
SOAPMessage msg = mf.createMessage(); 

// Object for message parts 
SOAPPart sp = msg.getSOAPPart(); 
StreamSource prepMsg = new StreamSource(
    new FileInputStream("path/prepared.msg")); 
sp.setContent(prepMsg); 

// Save message 
msg.saveChanges(); 

// View input 
System.out.println("\n Soap request:\n"); 
msg.writeTo(System.out); 
System.out.println(); 

// Send 
String urlval = "http://www.pascalbotte.be/rcx-ws/rcx"; 
SOAPMessage rp = conn.call(msg, urlval); 

// View the output 
System.out.println("\nXML response\n"); 

// Create transformer 
TransformerFactory tff = TransformerFactory.newInstance(); 
Transformer tf = tff.newTransformer(); 

// Get reply content 
Source sc = rp.getSOAPPart().getContent(); 

// Set output transformation 
StreamResult result = new StreamResult(System.out); 
tf.transform(sc, result); 
System.out.println(); 

// Close connection 
conn.close(); 

     } 
     catch (Exception e) { 
System.out.println(e.getMessage()); 
     } 
    } 
    }