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を取得 、しかし実際にはあまり理解していませんでした。誰かが説明やどんな種類のガイドを提供することができればそれは本当にありがたいです!
[〜#〜] 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);
}
}
それが役に立てば幸い、