2017-01-16 11 views
-1

こんにちは私は、SOAP RPCサービスを使用しているアプリケーションで作業しています。クライアントコードを作成し、SOAPサービスからsoapmessageレスポンスを取得しました。 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のWebサービスについてもっと読む時間がありますか? ... "クライアントコードを作成しました..." - 何のために使用しましたか? JAXB、Axis2または何ですか? – Vadim

+0

SOAPサービスは非常に古い方法で設計されており、JAXBまたはaxis2をサポートしていません。私はjavax.xml.soapを使ってクライアントコードを開発しました。 – user3541321

+0

私はJAXBとAXis2を認識していますが、ここでは非常に古い技術でサービスが開発されています。私はアプリケーションでそれらを消費してしまい、サービスコードで何も変更できません。 – user3541321

答えて

0

[OK]を、ので、これは醜い見えるかもしれませんが、あなたは別の技術を使用することはできませんように、あなただけのDOMオブジェクトとしてSOAP応答を横断する必要があります。

これは、最初にitemのノードを見つけ出すことを意味します。次に、数字がSOAP_SERVICEkeyという子を持つitemを探して、1つずつ探します。

valueノードが見つかるまで、見つかったらkeyノードの子ノードを通過します。ここで

は(あなたのコードからの続き)実施例である

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

ヘルプCristianに感謝します。クライアントコードはSOAP 1.1を使用して開発され、上記のコードはSOAP 1.1には適合しません。エラーjavax.xml.soap.SOAPExceptionを出しています:InputStreamは有効なSOAP 1.2メッセージを表していません。 – user3541321