java - 创建不带 ns1、ns2、ns3 命名空间的 SOAP 请求

标签 java soap xml-namespaces qnames

我正在实现一个Web服务客户端,它的请求应该是这样的,它与soap-ui一起工作。

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:met="http://tempuri.org/">

    <soapenv:Header>
        <met:Authentication>
            <met:Username>test</met:Username>
            <met:Password>test</met:Password>
        </met:Authentication>
    </soapenv:Header>
    <soapenv:Body>
        <met:UpdateOrder>
            <met:ID>5311221</met:ID>
            <met:Status>true</met:Status>
        </met:UpdateOrder>
    </soapenv:Body>
</soapenv:Envelope>

我需要添加一个身份验证 header ,到目前为止我的工作如下,

SOAPHeaderElement header=new SOAPHeaderElement("http://tempuri.org/","met");
header.setActor(null);
MessageElement usernameToken = new MessageElement(new QName("Authentication","met"));

header.addChild(usernameToken);

MessageElement userToken = new MessageElement(new QName("Username","met"));
userToken.addTextNode(userName);
usernameToken.addChild(userToken);

MessageElement passToken = new MessageElement(new QName("Password","met"));
passToken.addTextNode(password);
                
usernameToken.addChild(passToken);
_stub.setHeader(header);

这样我就可以得到以下请求

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    
    <soapenv:Header>
        <ns1:met soapenv:mustUnderstand="0" xmlns:ns1="http://tempuri.org/">
            <ns2:met xmlns:ns2="Authentication">
                <ns3:met xmlns:ns3="Username">test</ns3:met>
                <ns4:met xmlns:ns4="Password">test</ns4:met>
            </ns2:met>
        </ns1:met>
    </soapenv:Header>
    <soapenv:Body>
        <UpdateOrder xmlns="http://tempuri.org/">
            <ID>4576175</ID>
            <Status>true</Status>
        </UpdateOrder>
    </soapenv:Body>
</soapenv:Envelope>

我的问题是我应该怎么做才能获得工作请求?我猜我需要删除 ns1ns2 命名空间。

最佳答案

我认为您正在添加一些不必要的命名空间并添加多个 XML 节点,对代码进行简单修改后应该能够添加您想要添加的 header 。

    SOAPHeaderElement header=new SOAPHeaderElement("http://tempuri.org/","Authentication");
    //**set the prefix met, though not necessary, the parser will default it to ns1 or something**/
    header.setPrefix("met");
    /**Add the username Node**/
    SOAPElement user=header.addChildElement("userName");
    /**Add the userName text**/
    user.addTextNode("MyName");
    /**Add the password node**/
    SOAPElement password=header.addChildElement("password");
    /**Add the password text**/
    password.addTextNode("myPass");
    /** Print the header if you wish to**/
    System.out.println(header);     
    /**set the header to stub, that's all, I think, you may setActor and mustunderstand**/
    _stub.setHeader(header);

希望对您有所帮助。

关于java - 创建不带 ns1、ns2、ns3 命名空间的 SOAP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52035059/

相关文章:

java - XSLT 和 Java : Default Namespace XMLNS

java - Spring Batch RowMapper - 获取列数和类型

java - 由 : java.net.ConnectException 引起:连接被拒绝 Cloudify CLI

Java - 从 url 下载 zip 文件

java - 您可以使用 JAX-WS 和 SOAP 抛出链式异常吗?

xml - 根据 WSDL(xsd 架构)验证 xml 时了解 elementFormDefault 合格/不合格

java - 如何在 Selenium Webdriver 中比较数组列表与列表 Web 元素

perl - 如何通过解析 WSDL 文件直接创建 SOAP 请求?

python - 如何使用已经是 xml 格式的请求消息来提供泡沫

xml - 此命名空间中的组件无法从架构文档中引用