首页 > 解决方案 > 将原始文本添加到 SOAP 标头

问题描述

在 Java 中,我需要将包含客户端 SOAP 请求的身份验证数据的 SOAP 标头添加到我无法控制的第 3 方 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>

服务器端无法处理xmlns=""我尝试过的所有命令似乎都添加到用户名和密码标签名称中的额外内容。

如果我尝试构造一个字符串并将该文本直接添加到AutheticationHeader元素中,则 < 和 > 字符将被转义。我也尝试过 CDATA 标记...防止转义 < 和 > 字符,但服务器仍然不喜欢它。

我找到了一个解决方案,构造 aDocument来保存原始文本(防止转义字符),然后添加它,但不幸的是,它似乎Document只能添加到 SOAP 主体,而不是 SOAP 标头。

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

我从服务器得到正确的响应,所有正确的 SOAP 输出标签都没有,但标签中包含的错误消息是“无法验证”。

谢谢!

标签: javasoaptextheader

解决方案


以下代码将生成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);

推荐阅读