java - 将原始文本添加到 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 输出标签都没有,但标签中包含的错误消息是“无法验证”。
谢谢!
解决方案
以下代码将生成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);
推荐阅读
- angular - NPM 更新后 Ionicons 不工作 Ionic V4
- amazon-web-services - 根据目标组健康检查状态更改 Ansible 动态库存订单
- c++ - 编写高效的回溯函数
- node.js - 如何基于 OpenAPI Spec 3.0 生成 Node Rest API Client
- sql - sum case 问题,groupby 子句没有列
- c# - 使用 exel 和互操作 COM 的 C# 内存泄漏
- node.js - 如何在 CentOS 上使用 Nginx 反向代理到域子文件夹中的 Node.js 应用程序?
- angular - 在 application.yml 中获取打包在 Jar 中的文件夹的 dir 路径
- android - Unity 2019.3.0f6 Gradle 构建失败
- c# - Azure 函数 blobtrigger 不应在子文件夹上触发