【问题标题】:PHP Soap non-WSDL call: how do you pass parameters?PHP Soap 非 WSDL 调用:如何传递参数?
【发布时间】:2009-05-29 21:09:18
【问题描述】:

我正在尝试像这样在 PHP (5.2.5) 中进行非 WSDL 调用。我确定我错过了一些简单的东西。这个调用有一个参数,一个字符串,叫做“timezone”:

    $URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';

    $client = new SoapClient(null, array(
        'location' => $URL,
        'uri'      => "http://www.Nanonull.com/TimeService/",
        'trace'    => 1,
        ));

// First attempt:
// FAILS: SoapFault: Object reference not set to an instance of an object
   $return = $client->__soapCall("getTimeZoneTime",
       array(new SoapParam('ZULU', 'timezone')),
       array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
    );

// Second attempt:
// FAILS: Generated soap Request uses "param0" instead of "timezone"
   $return = $client->__soapCall("getTimeZoneTime",
       array('timezone'=>'ZULU' ),
       array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
   );

感谢您的任何建议
-戴夫

【问题讨论】:

标签: php web-services soap


【解决方案1】:

谢谢。这是现在可以使用的完整示例:

$URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';

$client = new SoapClient(null, array(
    'location' => $URL,
    'uri'      => "http://www.Nanonull.com/TimeService/",
    'trace'    => 1,
    ));

$return = $client->__soapCall("getTimeZoneTime",
   array(new SoapParam('ZULU', 'ns1:timezone')),
   array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
);

【讨论】:

    【解决方案2】:

    @Dave C 的解决方案对我不起作用。环顾四周,我想出了另一个解决方案:

    $URL = 'http://www.nanonull.com/TimeService/TimeService.asmx';
    
    $client = new SoapClient(null, array(
        'location' => $URL,
        'uri'      => "http://www.Nanonull.com/TimeService/",
        'trace'    => 1,
        ));
    
    $return = $client->__soapCall("getTimeZoneTime",
       array(new SoapParam(new SoapVar('ZULU', XSD_DATETIME), 'timezone')),
       array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
    );
    

    希望这可以帮助某人。

    【讨论】:

      【解决方案3】:

      问题在于参数中缺少命名空间信息。我使用了您示例的第一个案例,因为它最接近我的想法。

      如果换行:

      array(new SoapParam('ZULU', 'timezone')),
      

      到:

      array(new SoapParam('ZULU', 'ns1:timezone')),
      

      它应该会给你预期的结果。

      【讨论】:

        【解决方案4】:

        您可以尝试在您的参数周围添加另一个 array() 调用,如下所示:

        $params = array('timezone'=>'ZULU' );
        $return = $client->__soapCall("getTimeZoneTime",
            array($params),
            array('soapaction' => 'http://www.Nanonull.com/TimeService/getTimeZoneTime')
        );
        

        我无法测试这个,但你可以。

        【讨论】:

        • 试过了,但是它将整个数组作为 param0 传递。所以不去了。
        猜你喜欢
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 2012-05-20
        相关资源
        最近更新 更多