2017-01-16 5 views
-1

Привет Я работаю над приложением, которое использует SOAP RPC-сервис. Я создал клиентский код и получаю ответ с мыльной записью от службы SOAP. Службы SOAP разработаны в старых технологиях и не поддерживают JAXB или AXIS2.Анализ ответа SOAP RPC

Мой ответ SOAPMessage, как:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<ns1:LoginResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://DefaultNamespace"> 
<LoginReturn xsi:type="ns1:ResultMap"> 
    <items xsi:type="soapenc:Array" soapenc:arrayType="ns1:ResultMapItem[2]" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> 
<item> 
    <key xsi:type="xsd:string">SOAP_SERVICE</key> 
    <value xsi:type="xsd:string">https://somevalue</value> 
</item> 
<item> 
    <key xsi:type="xsd:string">UI_SERVICE</key> 
    <value xsi:type="xsd:string">https://somevalue</value> 
</item> 
</items> 
</LoginReturn> 
</ns1:LoginResponse> 
</soapenv:Body> 
</soapenv:Envelope> 

Теперь я должен получить значение «SOAP_SERVICE» с карты и сохранить его в какой-либо переменной. Может кто-нибудь, пожалуйста, предложите мне что-то, как я могу продолжить.

Спасибо.

Добавление кода клиента.

 SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
     SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 
     String url = "https://serviceUrl"; 
     String soapRequest = "requeststring"; 

     System.out.println("soapRequest.."+soapRequest); 

     InputStream is = new ByteArrayInputStream(soapRequest.getBytes()); 
     SOAPMessage request = MessageFactory.newInstance().createMessage(null, is); 
     SOAPMessage soapResponse = soapConnection.call(request, url); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     soapResponse.writeTo(out); 
+0

Вопроса слишком широк. Существует так много стандартных способов сделать это. Может быть, пришло время больше узнать о веб-сервисах на Java? ... «Я создал код клиента ...» - что вы использовали для этого? JAXB, Axis2 или что? – Vadim

+0

SOAP-сервис разработан очень старым способом и не поддерживает JAXB или axis2. Я использовал javax.xml.soap для разработки кода клиента. – user3541321

+0

Я знаю JAXB и AXis2, но здесь службы разработаны в очень старых технологиях, и я их потребляю в своем приложении, и снова я не могу что-то изменить в служебном коде. – user3541321

ответ

0

Хорошо, так что это может выглядеть некрасиво, но так как вы не можете использовать другую технологию, вам придется пройти ответ SOAP просто как объект DOM.

Это означает, что сначала найдите узлы item. Затем пройдите по ним один за другим, ищите item, у которого есть дочерний узел key со значением SOAP_SERVICE.

После того, как вы нашли, пройдите через key узел детей, пока не найдете узел value.

Вот рабочий пример (продолжение кода)

SOAPBody body = soapResponse.getSOAPBody(); 

    NodeList returnList = body.getElementsByTagName("item"); 

    for (int i = 0; i < returnList.getLength(); i++) { 
     NodeList innerResultList = returnList.item(i).getChildNodes(); 

     for (int j = 0; j < innerResultList.getLength(); j++) { 
      if ("KEY".equalsIgnoreCase(innerResultList.item(j).getNodeName()) 
        && "SOAP_SERVICE".equalsIgnoreCase(innerResultList.item(j).getTextContent())) { 
       for (int k = j +1; k < innerResultList.getLength(); k++){ 
        if ("VALUE".equalsIgnoreCase(innerResultList.item(k).getNodeName())) { 
         System.out.println("Value for SOAP_SERVICE is " + innerResultList.item(k).getTextContent()); 
         break; 
        } 
       } 
      } 
     } 
    } 

Надеется, что это помогает

+0

«но поскольку вы не можете использовать другую технологию ...» - это ложное предположение, сделанное пользователем @ user3541321. Кому важно, как WebService реализован на стороне сервера? SOAP - SOAP, и это зависит от реализации клиента, что использовать ... – Vadim

+0

Спасибо за помощь Кристиан. Код клиента разработан с использованием SOAP 1.1 и выше код не подходит для SOAP 1.1. Он дает ошибку javax.xml.soap.SOAPException: InputStream не представляет собой действительное сообщение SOAP 1.2. – user3541321

Смежные вопросы