3

我的应用程序使用 CakePHP (2.2.5) 从 SOAP 服务器获取数据。我将日志记录到 SoapSource.php 连接器以查看返回的 XML 并显示返回的数组:

$result = $this->client->__soapCall($method, array('parameters' => $tParams));
Logger::write('SOAP Last Response', $this->client->__getLastResponse(), 3, 'transaction');
Logger::write('SOAP Last Response Object', print_r($result, TRUE), 3, 'transaction');

但是我在日志中看到的是数组中缺少XML 中存在的两个(最近添加的)字段,特别是 RPList 之前的最后两个字段(此处格式化但逐字逐句):

<transactionResult>
  <id>test</id>
  <resultCode>0</resultCode>
  <ReadScheduledRecordingsRsp>
    <RecordingDefinitionList>
      <RecordingDefinition>
        <RDId>d8c16d8f-67c6-469a-83c3-d51d8f8859a9</RDId>
        <Title>The Young and the Restless</Title>
        <SeriesId>4422</SeriesId>
        <KeepUntil>SpaceIsNeeded</KeepUntil>
        <StartPadSeconds>0</StartPadSeconds>
        <EndPadSeconds>0</EndPadSeconds>
        <Frequency>EveryDay</Frequency>
        <KeepAtMost>0</KeepAtMost>
        <Priority>23</Priority>
        <ShowType>Any</ShowType>
        <AirtimeDomain>SpecificTime</AirtimeDomain>
        <ChannelDomain>SpecificChannel</ChannelDomain>
        <RPList>
          ...

其次是:

ARRAY
 (
  [transactionResult] => stdClass Object
   (
    [id] => test
    [resultCode] => 0
    [ReadScheduledRecordingsRsp] => stdClass Object
     (
      [RecordingDefinitionList] => stdClass Object
       (
        [RecordingDefinition] => Array
         (
           [0] => stdClass Object
            (
             [RDId] => d8c16d8f-67c6-469a-83c3-d51d8f8859a9
             [Title] => The Young and the Restless
             [SeriesId] => 4422
             [KeepUntil] => SpaceIsNeeded
             [StartPadSeconds] => 0
             [EndPadSeconds] => 0
             [Frequency] => EveryDay
             [KeepAtMost] => 0
             [Priority] => 23
             [ShowType] => Any
             [RPList] => stdClass Object
              (
              ...

我猜我只是忘记或不知道该做什么,但我不知道是什么。只是很怀疑这两个不起作用的字段是刚刚添加的两个,但是我找不到任何枚举字段的地方。

WSDL 根本没有指定任何字段,只是在 transactionResult 中会有一堆数据。

在连接调用中,选项同样不指定任何字段。

在后端添加这两个字段之前一切正常,并且一切仍然正常,除了我看不到对象中的 2 个新字段。

有任何想法吗?

4

1 回答 1

0

很高兴看到 RPList 的 XML。什么版本的 PHP/libxml?

您是否真正验证了 __getLastResponse() 返回的 XML?

在我看来,这听起来像是您为客户端使用 WSDL 模式,但您的 WSDL 文件缺乏精确度。尝试使用实际描述 API 提供的数据的 WSDL。

我是否理解转储列表时的 $result 对象RPList但值不是您所期望的?如果是这样,您可能可以将SOAP_SINGLE_ELEMENT_ARRAYS选项添加到客户端构造函数中:new SoapClient($wsdl, array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));. 不过,这是一个很长的镜头。需要查看 WSDL 和__getLastResponse().

有什么错误吗?尝试像这样包装电话:

try {

  $client = new SoapClient ('http://yoursite.com?WSDL', 
    array("trace" => 1,
      "exceptions" => true,
      "cache_wsdl" => WSDL_CACHE_NONE,
      "features" => SOAP_SINGLE_ELEMENT_ARRAYS)
  );

  $result = $client->SomeMethod($data);

} catch (SoapFault $exception) {
  var_dump($exception);
} catch (Exception $exception) {
  var_dump($exception);
}

没有修复 WSDL/XML 响应,您的解决方法似乎是最好的解决方案。

于 2013-05-16T19:00:53.993 回答