web-dev-qa-db-ja.com

SOAPメッセージin Java

SOAPメッセージから特定の部分を取得し、それらの値を取得するにはどうすればよいですか?

たとえば、.wsdlメッセージはこれです:

<wsdl:message name="theRequest">
      <wsdl:part name="username" type="xsd:string"/>
      <wsdl:part name="password" type="xsd:string"/>
      <wsdl:part name="someMsg"  type="xsd:string"/>
</wsdl:message>

someMsg値を取得し、それをString変数に保存したいと思います。

私はこれを見ていました: SoapBody Element valueを取得 、しかし実際にはあまり理解していませんでした。誰かが説明やどんな種類のガイドを提供することができればそれは本当にありがたいです!

5
o.o

[〜#〜] soap [〜#〜]メッセージとを処理するクライアントを作成する通常の方法Webサービスは; .xsdスキーマからBeanを生成し、.wsdlからすべてのスタブを生成してWebサービスを呼び出します(この場合はJavaは、たとえば[〜#〜] jaxws [〜#〜]および[〜#〜] jaxb [〜#〜])。

通常は.wsdlでサービスを定義しますが、リクエストの解析方法を尋ねる場合は、.xsdを表示することをお勧めします。

とにかくもちろん、直接Apache http clientを使用してWebサービスを呼び出すことができます)などでPOSTを作成し、応答を処理します...ただし、これはSOAP Webサービスは、ビジネスを作成するために各応答を手動で解析する必要があるためです。これがあなたの場合であると仮定すると、これと同様のことを実行してSOAPメッセージ(質問に入力したリンクに基づいてこのクラスを使用したいようですので、javax.xml.soap.SOAPMessageを使用します)。

たとえば、次のようなSOAPメッセージを受信して​​いる場合:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
    <theRequest>
        <username>user</username>
        <password>password</password>
        <someMsg>sooomeMessage</someMsg>
      </theRequest>
   </soapenv:Body>
</soapenv:Envelope>

次のようなことができます。

import Java.io.FileInputStream;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPMessage;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SOAPMessageTest {

    public static void main(String[] args) throws Exception {

        // create message factory
        MessageFactory mf = MessageFactory.newInstance();
        // headers for a SOAP message
        MimeHeaders header = new MimeHeaders();     
        header.addHeader("Content-Type", "text/xml");

        // inputStream with your SOAP content... for the 
        // test I use a fileInputStream pointing to a file
        // which contains the request showed below
        FileInputStream fis = new FileInputStream("/path/yourSOAPReq.xml");

        // create the SOAPMessage
        SOAPMessage soapMessage = mf.createMessage(header,fis);
        // get the body
        SOAPBody soapBody = soapMessage.getSOAPBody();
        // find your node based on tag name
        NodeList nodes = soapBody.getElementsByTagName("someMsg");

        // check if the node exists and get the value
        String someMsgContent = null;
        Node node = nodes.item(0);
        someMsgContent = node != null ? node.getTextContent() : "";

        System.out.println(someMsgContent);
    }

}

コメントに基づいて編集:

Java 8でも機能しますが、現時点での唯一の推測は、FileInputStreamで何かが起こっているということです。同じであるが、FileからではなくStringからリクエストを取得する次のコードを試すことができますか。

import Java.io.ByteArrayInputStream;
import Java.io.InputStream;

import javax.xml.soap.MessageFactory;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPMessage;

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class SOAPMessageTest {

    public static void main(String[] args) throws Exception {

        // create message factory
        MessageFactory mf = MessageFactory.newInstance();
        // headers for a SOAP message
        MimeHeaders header = new MimeHeaders();     
        header.addHeader("Content-Type", "text/xml");

        String request = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"+
         "<soapenv:Body>"+
           "<theRequest>"+
             "<username>user</username>"+
             "<password>password</password>"+
             "<someMsg>sooomeMessage</someMsg>"+
           "</theRequest>"+
          "</soapenv:Body>"+
        "</soapenv:Envelope>";
        InputStream is = new ByteArrayInputStream(request.getBytes());

        // create the SOAPMessage
        SOAPMessage soapMessage = mf.createMessage(header,is);
        // get the body
        SOAPBody soapBody = soapMessage.getSOAPBody();
        // find your node based on tag name
        NodeList nodes = soapBody.getElementsByTagName("someMsg");
        System.out.println(nodes.getClass().getName());
        // check if the node exists and get the value
        String someMsgContent = null;
        Node node = nodes.item(0);
        someMsgContent = node != null ? node.getTextContent() : "";

        System.out.println(someMsgContent);
    }
}

それが役に立てば幸い、

8
albciff