将原始文本添加到SOAP标头

时间:2018-06-16 01:36:25

标签: java soap text header

在Java中,我需要将包含客户端SOAP请求的身份验证数据的SOAP头添加到我无法控制的第三方Web服务。我已经设置了一个SOAPHandler,并监视发送到服务器端的实际代码以查看发生了什么。身份验证无效。

我真正需要的是:

<soap12:Header>
    <AuthenticationHeader xmlns="http://abc.xyz.com/">
      <UserName>uname</UserName>
      <Password>pwd</Password>
    </AuthenticationHeader>
  </soap12:Header>

我可以创建AuthenticationHeader元素并使用SOAPHeader.addHeaderElement方法添加它而不会出现问题,但我无法正确添加用户名和密码内容。我可以从使用各种命令设置SOAPElement的文本(setValue,setTextContent,addTextNode),然后使用SOAPHeaderElement.addChildElement得到的是

<soap12:Header>
        <AuthenticationHeader xmlns="http://abc.xyz.com/">
          <UserName xmlns="">uname</UserName>
          <Password xmlns="">pwd</Password>
        </AuthenticationHeader>
      </soap12:Header>

服务器端无法处理我尝试的所有命令似乎添加到UserName和Password标记名称的额外xmlns=""

如果我尝试构造一个字符串并将该文本直接添加到AutheticationHeader元素,那么&lt;和&gt;字符被转义。我还试过CDATA标签......这可以防止&lt;&lt;和&gt;字符,但服务器仍然不喜欢它。

我找到了构建Document以保存原始文本(防止转义字符)的解决方案,然后添加它,但遗憾的是,Document似乎只能添加到SOAP正文,而不是SOAP标题。

有没有人有任何建议如何克服这个?服务器人员使用.NET编程,而不是Java编程,因此他们无法提供帮助。

我从服务器得到了正确的响应,所有关闭了正确的SOAP输出标记,但标记中包含的错误消息是&#34;无法验证&#34;。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下代码将生成您想要生成的正​​确的Authentication标头。

SOAPHeader header = request.getSOAPHeader();

Document doc = header.getOwnerDocument();

Element el1 = doc.createElementNS("http://abc.xyz.com/","UserName");
el1.setTextContent("MyName");

Element el2 = doc.createElementNS("http://abc.xyz.com/","Password");
el2.setTextContent("pass******");

Element el0 = doc.createElementNS("http://abc.xyz.com/", "AuthenticationHeader");

el0.appendChild(el1);
el0.appendChild(el2);
header.appendChild(el0);