【问题标题】:Get Strings from SOAP Message in Java从 Java 中的 SOAP 消息中获取字符串
【发布时间】:2016-09-17 20:44:02
【问题描述】:

如何从 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 值并将其保存到字符串变量中。

我在看这个:Get SoapBody Element value,但并没有真正了解多少。如果有人可以提供解释或任何类型的指南,将不胜感激!

【问题讨论】:

    标签: java xml web-services soap wsdl


    【解决方案1】:

    创建客户端处理SOAP消息和web服务的正常方式是;从 .xsd 模式生成 bean,并从 .wsdl 生成所有存根以调用 web 服务(在这种情况下,对于 Java,例如可以使用 JAXWSJAXB)。

    还请注意,通常.wsdl 定义服务,但如果您询问如何解析请求,最好显示.xsd

    当然,您当然可以调用 web 服务 使用直接和 apache http 客户端 左右进行 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 发生了一些事情。你能试试下面的代码吗

    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);
        }
    }
    

    希望对你有帮助,

    【讨论】:

    • 感谢您的详细回复!但是,我对提供的代码有疑问。当我打印它时,我只会得到null。我认为问题出在这条线上:Node node = nodes.item(0)。 Eclipse 给我一个错误,说它需要转换为Node。所以我将其更改为:Node node = (Node) nodes.item(0),我没有收到编译器错误。不知道为什么它说字符串为空。
    • @m.o 可能需要 (Node) 强制转换,因为 org.w3c.dom.NodeList.item() 返回的类型取决于 java 版本。我正在使用 Java 7,这里 item() 方法返回 Node,因此不需要强制转换。关于为什么你的字符串是null,你能分享一下你试图解析:)xml吗?
    • 我想我当时有点困惑。我认为/path/yourSOAPReq.xml 是上面发布的SOAP 消息。你能提供一个样本xml 该文件应该是什么样子吗?它只是一个普通的xml 文件,具有.xsd 中定义的属性吗?
    • @mo 是的,它是:),只是我认为您正在尝试另一个,因为它不适合您...如果您使用的是答案中的示例xml作为源代码必须有效。你用的是哪个java版本?
    • 我正在使用 Java 8。顺便说一句,感谢您的帮助!
    猜你喜欢
    • 2019-05-11
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多