【发布时间】:2021-07-28 22:57:18
【问题描述】:
我必须将 Javascript 应用程序 (NodeJS) 与 PHP SOAP 服务器通信。现在,我正在使用soap 包,我已在另一个项目(Java SOAP 服务器)中成功使用过它。但是,这次我在试图让两个部分相互理解时遇到了一些麻烦。我将向您展示一个请求示例(我已经稍微简化了代码):
import * as soap from 'soap';
const soapClient = await soap.createClientAsync(wsdlUrl);
async getUserByUsername(username: string) {
const secret_key = await buildSecretKey();
const response = await soapClient['WSGetUserFromUsernameAsync']({
secret_key,
username
}, { timeout: 5000 });
return response;
}
const user = await getUserByUsername('admin');
这不起作用,因为当我在 PHP 后端看到日志时,这些是它正在接收的参数,如日志文件中所示:
$params: SECRET_KEY
如您所见,它只接收密钥参数而不是完整对象。但是,如果我使用 PHP 调用 SOAP 方法,它可以正常工作。我使用以下(简化的)代码:
$soap = new SoapClient($wsdlUrl);
$secret_key = buildSecretKey();
$result = $soap->WSGetUserFromUsername(array(
'secret_key' => $secret_key,
'username' => 'admin'
));
在这种情况下,日志文件显示以下参数:
$params: Array\n(\n [username] => admin\n [secret_key] => SECRET_KEY\n)\n
我认为问题在于 Javascript 客户端 (JSON) 发送的数据没有被服务器(PHP 关联数组)转换为预期的格式,但我不确定,因为我仍然没有是时候在服务器上跟踪请求并查看它收到了什么。
编辑
我使用tcpdump 来查看PHP 和JS SOAP 客户端发出的请求,我想我找到了问题所在。这是 JS SOAP 请求:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="urn:WSRegistration">
<soap:Body>
<tns:WSGetUserFromUsername>
<secret_key>SECRET_KEY</secret_key>
<username>admin</username>
</tns:WSGetUserFromUsername>
</soap:Body>
</soap:Envelope>
这是来自 PHP 客户端:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:WSRegistration" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:WSGetUserFromUsername>
<GetUserFromUsername xsi:type="ns1:GetUserArgUsername">
<username xsi:type="xsd:string">admin</username>
<secret_key xsi:type="xsd:string">SECRET_KEY</secret_key>
</GetUserFromUsername>
</ns1:WSGetUserFromUsername>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
如您所见,PHP客户端生成的信封有一个额外的节点(GetUserFromUsername),我认为这可能会导致服务器中的参数分配错误。
无论如何,有什么线索可以尝试吗?谢谢!
【问题讨论】:
标签: javascript php node.js soap