o.o*_*o.o 5 java xml soap wsdl web-services
如何从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>
Run Code Online (Sandbox Code Playgroud)
我想获得someMsg价值并将其保存到String变量中.
我在看这个:获得SoapBody Element的价值,但并不是很了解.如果有人可以提供解释或任何类型的指南,将非常感谢!
创建客户端来处理SOAP消息和Web服务的常规方法是:从.xsd模式生成bean ,并从中.wsdl调用Web服务的所有存根(例如,对于Java,可以使用JAXWS和JAXB).
另请注意,通常.wsdl定义服务,但如果您询问如何解析请求最好显示.xsd.
无论如何你当然可以直接使用apache http客户端来调用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>
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
基于评论的编辑:
它也适用于Java 8,现在我唯一的猜测就是发生了一些事情FileInputStream.你可以尝试如下的代码是相同的,但得到一个请求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);
}
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你,
| 归档时间: |
|
| 查看次数: |
21399 次 |
| 最近记录: |