2010-06-17 2 views
4

J'essaye d'écrire du code dans Java pour en savoir plus sur le codage avec WSDL et SOAP.Java SOAP - Besoin d'aide sur la manipulation Body and ChildElement

Par exemple donné:

'<'to:checkAccount xmlns:to="http://foo"> 
     '<'to:id> test '<'/to:id> 
     '<'to:password> test '<'/to:password> 
'<'to:checkAccount >"

'<'element name="checkAccountResponse"> '<'complexType> '<'sequence> '<'element name="checkAccountReturn" type="impl:account"/> '<'/sequence> '<'/complexType> '<'/element>

'<'complexType name="account"> '<'sequence> '<'element name="active" type="xsd:boolean"/> '<'element name="name" type="xsd:string"/> '<'/sequence> '<'/complexType>

mon code ressemble à ceci au moment:


//create the message 
      String endpoint = "http://foo/someAPI"; 

      MessageFactory factory = MessageFactory.newInstance(); 
      SOAPMessage message = factory.createMessage(); 


      SOAPPart soapPart = message.getSOAPPart(); 
      SOAPEnvelope envelope = soapPart.getEnvelope(); 
      SOAPHeader header = message.getSOAPHeader(); 

      //adding to the body 
      SOAPBody body = message.getSOAPBody(); 
      SOAPFactory soapFactory = SOAPFactory.newInstance(); 
      Name bodyName = soapFactory.createName("checkAccount","to","http://foo"); 
      SOAPElement bodyElement = body.addBodyElement(bodyName); 

      //add the ID child elements 
      soapFactory = SOAPFactory.newInstance(); 
      Name childName = soapFactory.createName("id","to","http://foo"); 
      SOAPElement symbol = bodyElement.addChildElement(childName); 
      symbol.addTextNode("test"); 

      //add password child element 
      soapFactory = SOAPFactory.newInstance(); 
      childName = soapFactory.createName("password","to","http://foo"); 
      symbol = bodyElement.addChildElement(childName); 
      symbol.addTextNode("test"); 


      //call and get the response 
      SOAPMessage response = sc.call(message,endpoint); 


      //print the response 
      SOAPBody responseBody = response.getSOAPBody(); 
      java.util.Iterator iterator = responseBody.getChildElements(bodyName); 
. 
. 
. 
//the response is blank so trying to iterate through it gives the exception

Je cours et je ne reçois rien en retour, juste vide. Je sais que mon endpoint est correct, ainsi que checkAccount, id et password depuis que je l'ai testé dans xmlSpy et qu'il retourne l'état du compte.

Cela doit être la façon dont j'essaie d'obtenir la réponse. Quelqu'un peut-il s'il vous plaît me donner un indice?

Répondre

3

Voici comment je le ferais.

MessageFactory factory = MessageFactory.newInstance();   
SOAPMessage message = factory.createMessage(); 
SOAPBody body = message.getSOAPBody(); 
SOAPElement checkAccEl = body 
    .addChildElement("checkAccount", "to", "http://foo"); 

SOAPElement idEl = checkAccEl 
    .addChildElement("id", "to", "http://foo"); 
idEl.addTextNode("test"); 

SOAPElement passwordEl = checkAccEl 
    .addChildElement("password", "to", "http://foo"); 
passwordEl.addTextNode("test"); 

// print out the SOAP Message. How easy is this?! 
ByteArrayOutputStream out = new ByteArrayOutputStream(); 
message.writeTo(out); 
System.out.println(out.toString()); 

La première fois que vous utilisez l'espace de noms « pour = http://foo » il est automatiquement déclaré sur l'élément - checkAccount dans ce cas. Lorsque vous utilisez à nouveau le même espace de noms, le XML n'aura pas besoin de le déclarer à nouveau, mais utilisera le préfixe.

La sortie ressemble à:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <to:checkAccount xmlns:to="http://foo"> 
      <to:id>test</to:id> 
      <to:password>test</to:password> 
     </to:checkAccount> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Ce qui est ce que vous voulez que je pense

+0

Merci pour votre aide Dunderklumpen, j'ai changé mon code afin qu'il ressemble à votre depuis sa plus facile à lire. Mais on dirait que le problème n'est pas cela et plus comme comment je dois lire et traiter la réponse. J'ai mis à jour mon post, pouvez-vous regarder s'il vous plaît et voir où je me trompe? aussi j'utilise eclipse, comment savez-vous à quoi ressemble exactement votre sortie? – ke3pup

+0

J'ai ajouté du code pour vous montrer comment imprimer le message SOAP. Bien sûr, cela ne formate pas le XML (tout est écrit sur une ligne). Vous pouvez utiliser eclipse pour le formater en procédant comme suit. 1. copier le code XML de la console de sortie 2. créer un nouveau document texte en eclipse coller le contenu 3. enregistrer le document en tant que .xml 4. Rouvrir le document et choisir le format (ctrl + shift + f). Pour une petite chaîne XML, cela ne vaut pas vraiment la peine, mais pour les grandes chaînes XML, cela peut être très utile. – Dunderklumpen

+0

Si vous voulez voir apparaître et aller la requête SOAP, vous devriez envisager d'utiliser TCPMon. https://tcpmon.dev.java.net/ peut agir comme un "homme au milieu". Vous pouvez configurer TCPMon pour qu'il écoute votre demande SOAP et l'envoie au bon serveur, puis il vous la transmet. C'est un moyen efficace de voir à quoi ressemblent la requête et la réponse. – Dunderklumpen