PHP SoapClient - 可能的名称间距问题 - 非 wsdl 模式

标签 php web-services soap wsdl

我以前成功地使用 PHP 的 SoapClient 库调用 .NET 服务,没有遇到太多问题,但现在我面临一个场景,我必须以非 WSDL 模式访问相同的服务。

我似乎或多或少创建了正确的 XML 结构来发送到服务,但服务器似乎没有获取我发送的变量。

根据 SOAPUI 的输出,我应该尝试生成以下 SOAP 调用:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://someservices.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <int:getService>
         <int:foo>String value for foo</int:foo>
         <int:bar>String value for bar</int:bar>
      </int:getService>
   </soapenv:Body>
</soapenv:Envelope>

我使用 SOAPClient 生成的输出是:

<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://someservices.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Body>
        <ns1:getService env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
            <foo xsi:type="xsd:string">String value for foo</foo>
            <bar xsi:type="xsd:string">String value for bar</bar>
        </ns1:getService>
    </env:Body>
</env:Envelope>

从 .NET 服务返回的错误是“bar预期!” - 至少表明该服务没有获取我的第二个参数。

我正在使用以下内容构建我的 SOAP 调用:

$foo = 'String value for foo';
$bar = 'String value for bar';    

$options = array(
                     'trace' => 1,
                     'exceptions' => 1,
                     'uri' => 'http://someservices.com',
                     'soapaction' => 'http://someservices.com/getService',
                     'soap_version' => SOAP_1_2,
                     'type_map' => array('type_ns' => 'int')
                     );

$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'foo'), new SoapParam($bar, 'bar')), $options);

我不确定问题是什么。现在我猜测这可能是 xmlns 属性问题。请注意,SOAPUI 调用在函数调用和参数前面指定了 int:。我尝试指定这个 xmlns 但没有成功。正如您所看到的,Soap Client 调用生成的 xmlns 是:

xmlns:ns1

任何帮助将不胜感激。

最佳答案

事实证明,将命名空间标记为 ns1 而不是 int 并不是问题。

问题是 getService 参数以命名空间 ns1 为前缀,而变量 foo 和 bar 则没有。

因此,通过将“ns1:”附加到soapCall 函数中的Soap 参数解决了这个问题,如下所示:

$response = $soapclient->__soapCall('getService', array( new SoapParam($foo, 'ns1:foo'), new SoapParam($bar, 'ns1:bar')), $options);

关于PHP SoapClient - 可能的名称间距问题 - 非 wsdl 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11932117/

相关文章:

php - Bonkers PHP 几个月?

php - 使用 REST 服务 core_files_upload 上传文件到 Moodle

c# - 上传 HttpPostedFileBase 文件和一些参数

python - 亚马逊 AWS EC2 : How to host an API and a website on EC2 instance

xml - Cvc-elt.1 : Cannot Find The Declaration Of Element 'soap:Envelope'

c# - WCF MessageHeader 不会写入命名空间

c++ - 寻找可移植的 SOAP 客户端 C++ 库

php - 如何在表格中显示搜索结果,同时将其导出为 csv 文件

php - 如何让 MySQL 每隔一段时间运行一次查询?

php - 获取数据时性能低下