Java SOAP - нужна помощь по манипулированию телом и дочерним элементом - PullRequest
4 голосов
/ 17 июня 2010

Я пытаюсь написать некоторый код в Java, чтобы узнать больше о кодировании с WSDL и SOAP.

Например, дано:

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

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

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

мой код выглядит так:


//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, и он возвращает статус учетной записи.

Это должен быть способ, которым я пытаюсь получить ответ. Может кто-нибудь дать мне подсказку?

1 Ответ

3 голосов
/ 17 июня 2010

Вот как я бы это сделал.

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

Когда вы впервые используете пространство имен 'to = 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>

Что вам нужноЯ думаю

...