2010-06-17 48 views
4

我想在java中編寫一些代碼,以瞭解有關使用WSDL和SOAP編碼的更多信息。Java SOAP - 在Body和ChildElement操作方面需要幫助

例如,給定:

'<'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>

我的代碼看起來像這樣的時刻:


//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

我運行此,我也得到任何回報,只是空白。我知道我的端點是正確的,以及checkAccount,id和密碼,因爲我已經在xmlSpy中測試過它並返回了賬戶狀態。

它必須是我試圖得到答覆的方式。有人可以給我一個提示嗎?

回答

3

這就是我該怎麼做的。

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()); 

您使用的命名空間「爲= http://foo」它是在元素上自動聲明的第一次 - checkAccount在這種情況下。當您再次使用相同的名稱空間時,XML將不需要再次聲明它,但會使用前綴。

輸出看起來像:

<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> 

這是你想要什麼,我認爲

+0

感謝您的幫助Dunderklumpen,我改變了我的代碼,以便它看起來像你的自更容易閱讀。但看起來問題不是這樣,更像是我需要閱讀和處理回覆。我更新了我的帖子,所以請你看看我的錯在哪裏? 我也使用eclipse,你怎麼知道你的輸出看起來如何? – ke3pup 2010-06-17 06:17:40

+0

我已經添加了一些代碼來向您展示如何打印出SOAP消息。當然這不會格式化XML(它全部寫在一行上)。通過執行以下操作,可以使用eclipse格式化它。 1.從輸出控制檯複製XML 2.在eclipse中創建一個新的文本文檔粘貼內容 3.保存文檔爲 .xml 4.重新打開文檔並選擇格式(ctrl + shift + f)。 對於小型XML字符串,這並不值得付出努力,但對於大型XML字符串,它可能非常有用。 – Dunderklumpen 2010-06-17 06:32:00

+0

如果您想查看來來去去的SOAP請求,您應該考慮使用TCPMon。 https://tcpmon.dev.java.net/可以充當「中間人」。您可以將TCPMon配置爲偵聽您的SOAP請求並將其發送到適當的服務器,然後將響應傳遞給您。它是查看請求和響應的有效方式。 – Dunderklumpen 2010-06-17 06:36:24