【问题标题】:PHP SOAP server + Javascript clientPHP SOAP 服务器 + Javascript 客户端
【发布时间】: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


    【解决方案1】:

    问题在于 SOAP 服务器希望将参数包装在一个额外的节点中。

    所以,而不是这个调用:

    const response = await soapClient['WSGetUserFromUsernameAsync']({
        secret_key,
        username
      }, { timeout: 5000 });
    

    正确的是:

    const response = await soapClient['WSGetUserFromUsernameAsync']({
      WSGetUserFromUsername: {
        secret_key,
        username
      }
    }, { timeout: 5000 });
    

    现在一切正常,干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多