在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;。
谢谢!
答案 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);