复杂类型的 PHP SoapParam/SoapVar 给出 "object hasn' t 'xxx' 属性”- 重复元素

标签 php soap repeat complextype

这个问题涉及在 PHP SOAP 客户端中使用 SoapParam 和 SoapVar 来处理重复元素,其中请求不能被构造为关联数组。更具体地说,它解决了将 SoapParam/SoapVar 用于复杂元素的困难。

我有我正在尝试修改的工作代码,以允许 SOAP 请求中的重复元素。

工作代码如下,并正确返回单个 consignmentID 的详细信息。

$oClient = new SoapClient($wsdlFilespec, $arguments);
$parameters = array(
   'header' => array(
      'source' => $_POST['source'],
      'accountNo' => $_POST['accountNo'],
      'userAccessKey' => $connection['userAccessKey']
      ),
   'consignmentId' => $_POST['consignmentId']
     );
$request = array('parameters' => $parameters);
$result = $oClient->__soapCall($operation, $request);

我现在需要能够传入多个 consignmentId,显然关联数组对此不起作用。所以我一直在尝试使用SoapParam和SoapVar;顺便说一句,没有找到很多关于这些的文档或示例。

我尝试了以下方法:

$header = array(
   new SoapParam((string)$_POST['source'], 'source'), 
   new SoapParam((int)$_POST['accountNo'], 'accountNo'),
   new SoapParam((string)$connection['userAccessKey'], 'userAccessKey')
  );

$parameters = array(
   new SoapParam($header, 'header'),
   new SoapParam((string)'PDH44109', 'consignmentId'),
   new SoapParam((string)'PDH44110', 'consignmentId')
     );
$request = array('parameters' => $parameters);

这给出:SOAP-ERROR:编码:对象没有“ header ”属性。

我也尝试过使用 SoapVar,希望强制使用复杂类型的“header”,如下所示:

$header = array(
  new SoapParam((string)$_POST['source'], 'source'), 
  new SoapParam((int)$_POST['accountNo'], 'accountNo'),
  new SoapParam((string)$connection['userAccessKey'], 'userAccessKey')
  );
$headerVar = new SoapVar($header, SOAP_ENC_OBJECT, 'TransactionHeaderType',     
"http://myexpress/Common/actions/externals/Consignment/v1");

$parameters = array(
           new SoapParam($headerVar, 'header'),
   new SoapParam((string)'PDH44109', 'consignmentId'),
   new SoapParam((string)'PDH44110', 'consignmentId')
     );
$request = array('parameters' => $parameters);

这还会给出:SOAP-ERROR:编码:对象没有“ header ”属性。

我还尝试了最后一行代码的变体,例如:

$request = array('parameters' => $parameters);
$request = array($parameters);
$request = $parameters;

作为实验,我临时为 $header 分配了一个字符串,然后能够在调用 __doRequest 之前查看 __soapCall 生成的 XML,发现它包含以下内容:

<SOAPENV:Body><ns1:getConsignmentDetailRequest/>
<consignmentId>PDH44109</consignmentId><consignmentId>PDH44110</consignmentId>
</SOAP-ENV:Body>

您可以看到已正确包含多批 cargo ——该部分似乎已解决——但完全省略了“header”(复杂类型)。

非常感谢任何帮助!我是一个真正的初学者,并且在这上面花了一天多的时间。我对 SoapVar 非常不确定,例如,合适的参数是什么。

也许“header”的输入有问题?下面提供了一些 wsdl 摘录以供引用。

------

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://my.com.au/ESB/Services/Concrete/External/Services/v1" 

xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns0="http://myexpress/Common/actions/externals/Consignment/v1" 

xmlns:ns1="http://myexpress/Common/externals/Faultv1" xmlns:ns2="http://myexpress/Common/actions/externals/FreightCalculation/v1" 

xmlns:ns3="http://myexpress/Common/Primitives/v1" xmlns:ns4="http://myexpress/Common/FreightProcessing/v1" 

xmlns:ns5="http://myexpress/Common/Account/v1" xmlns:ns6="http://myexpress/Common/Imaging/v1" name="Untitled" 

targetNamespace="http://my.com.au/ESB/Services/Concrete/External/Services/v1">

------

        <xsd:schema xmlns="http://myexpress/Common/Primitives/v1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" 

xmlns:acc="http://myexpress/Common/Account/v1" targetNamespace="http://myexpress/Common/Primitives/v1" elementFormDefault="qualified" 

attributeFormDefault="unqualified">
            <xsd:import namespace="http://myexpress/Common/Account/v1"/>
   .
   .
   .
   .

           <xsd:complexType name="TransactionHeaderType">
                <xsd:sequence>
                    <xsd:element name="source" type="xsd:string"/>
                    <xsd:element name="accountNo" type="xsd:integer"/>
                    <xsd:element name="userAccessKey" type="xsd:string"/>
                    <xsd:element name="userId" type="ns3:userIdType" minOccurs="0"/>
                    <xsd:element name="transactionId" type="ns3:transactionIdType" minOccurs="0"/>
                    <xsd:element name="transactionDatetime" type="xsd:dateTime" minOccurs="0"/>
                </xsd:sequence>
            </xsd:complexType>

------

            <xsd:simpleType name="consignmentIdType">
                <xsd:restriction base="xsd:string">
                    <xsd:maxLength value="30"/>
                </xsd:restriction>
            </xsd:simpleType>

------

            <xsd:element name="getConsignmentDetailRequest">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="header" type="prim:TransactionHeaderType"/>
                        <xsd:element name="consignmentId" type="ns0:consignmentIdType" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

------

最佳答案

在与 SoapVar 和 SoapParam 折腾了好几天却一无所获之后,找到了以下简单的解决方案:

$oClient = new SoapClient($wsdlFilespec, $arguments); 
$parameters = array(
                    'header' => array(
                                      'source' => $_POST['source'],
                                      'accountNo' => $_POST['accountNo'],
                                      'userAccessKey' => $connection['userAccessKey']
                                     ),
                    'consignmentId' => array('PDH44109', 'PDH44110')
                    );
$request = array('parameters' => $parameters);
$result = $oClient->__soapCall($operation, $request); 

关于复杂类型的 PHP SoapParam/SoapVar 给出 "object hasn' t 'xxx' 属性”- 重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4666994/

相关文章:

c# - 如何修复语音合成器自身重复 c#?

php - 提高复杂 SQL 查询的性能

php - Symfony2 + Propel Collection 未定义偏移量 : 2

php - Braintree 交易创建时 key 无效

WCF - 检查正在发送/接收的消息?

ios - 使用AVPlayerLooper循环播放多个视频

java - 向现有的 java 程序添加循环?

javascript - 将 HTML DOM 保存到服务器上的文件

php - 如何使用项目列表定义 SOAP 响应的 WSDL 复杂类型

soap - 将字节数组从 Web 服务发送到客户端