PHP Soap请求命名参数作为一个参数发送

时间:2018-03-24 21:23:29

标签: php soap

首先,如果Stack Overflow中已经出现此问题,我想道歉,但我的Google搜索无法找到它。

我在PHP 7.2上运行并创建了一个SoapClient来将RPC编码的请求发送到Web服务。

$this->client = new \SoapClient('https://tsp.demo.sk.ee/dds.wsdl', [
    'soap_version' => SOAP_1_1,
    'cache_wsdl' => WSDL_CACHE_NONE,
    'trace' => true,
    'style' => SOAP_RPC,
    'use' => SOAP_ENCODED,
]);

我现在尝试使用此客户端向MobileAuthenticate请求发送请求,并使用命名参数来执行此操作,因为我不需要填写所有可用参数。

$params = [
    'CountryCode' => 'EE',
    'PhoneNo' => '+3xxxxxxxxxx',
    'Language' => 'ENG',
    'ServiceName' => 'Testimine',
    'MessageToDisplay' => 'Test Message',
    'SPChallenge' => '12345678901234567890',
    'MessagingMode' => 'asynchClientServer',
];


try {
    $response = $this->client->MobileAuthenticate($params);
    dd($response);
} catch (\SoapFault $e) {
    var_dump($e);
    var_dump($this->client->__getLastRequest());
    var_dump($this->client->__getLastResponse());
}

我回来说语言代码不正确但是基于Web服务文档,它是。然后我开始检查$this->client->__getLastRequest()的输出,发现方法调用是以有序数组方式获取参数。它将第一个参数值设置为Array

我检查了SoapFault异常输出,实际上,我的命名参数嵌套在另一个数组

["args"]=>
  array(2) {
    [0]=>
    string(18) "MobileAuthenticate"
    [1]=>
    array(1) {
        [0]=>
      array(8) {
            ["IDCode"]=>
        string(0) ""
            ["CountryCode"]=>
        string(2) "EE"
            ["PhoneNo"]=>
        string(12) "+3xxxxxxxxxx"
            ["Language"]=>
        string(3) "ENG"
            ["ServiceName"]=>
        string(9) "Testimine"
            ["MessageToDisplay"]=>
        string(12) "Test Message"
            ["SPChallenge"]=>
        string(20) "12345678901234567890"
            ["MessagingMode"]=>
        string(18) "asynchClientServer"
      }
    }
  }

我已经尝试使用谷歌搜索类似的问题和我发现的一切(甚至在php.net上的评论)表明这是使用命名参数的方式,即使大多数现在服务期望使用命名参数。

几个月前,我参与了另一个运行在PHP 5.6上的项目,该项目也使用了SOAP Web服务,并且像魅力一样。 SoapClient实现方面,我看到的唯一区别是PHP版本。

我是否遗漏了自PHP 7以来发生过的一些我在文档中看不到的内容,或者我一味地没有看到这个问题?

小更新:我能够在Homebrew编译的PHP 5.6,7.0和7.2以及Arch Linux编译的PHP 7.2上重现这个问题。

1 个答案:

答案 0 :(得分:1)

我能够通过不使用魔术方法并使用__soapCall来解决这个问题,而这似乎对命名参数的行为恰到好处。

$response = $this->client->__soapCall('MobileAuthenticate', $params);