从Java中获取SOAP消息中的字符串

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的价值,但并不是很了解.如果有人可以提供解释或任何类型的指南,将非常感谢!

alb*_*iff 8

创建客户端来处理SOAP消息和Web服务的常规方法是:从.xsd模式生成bean ,并从中.wsdl调用Web服务的所有存根(例如,对于Java,可以使用JAXWSJAXB).

另请注意,通常.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)

希望能帮助到你,