首先,如果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上重现这个问题。
答案 0 :(得分:1)
我能够通过不使用魔术方法并使用__soapCall
来解决这个问题,而这似乎对命名参数的行为恰到好处。
$response = $this->client->__soapCall('MobileAuthenticate', $params);