Оценка PHP SOAP Array
Я работаю над следующим, что я надеюсь, будет простой сценарий. Я использую WSDL Cisco AXL, чтобы связаться с моим сервером Cisco CUPS, выполнить запрос SQL, пройтись по результатам, а затем передать их на другой шаг, чтобы обновить возвращаемые строки до определенного значения. Однако у меня возникает проблема, когда ответ SOAP, который я получаю, отличается от того, что он состоит из одной строки (объекта массива) или нескольких строк (массивов в массивах).
Вот сценарий прямо сейчас, я просто пытаюсь повторить и повторить то, что я получаю, прежде чем перейти к более сложным.
<?php
$client = new SoapClient("/var/www/AXLAPI.wsdl",
array('trace'=>true,
'exceptions'=>true,
'location'=>"https://cups-test:8443/axl",
'login'=>'admin',
'password'=>'password',
));
$response = $client->executeSQLQuery(array("sql"=>"select pkid from epasenduser where enablemoc = 't'"));
// var_dump($response);
foreach ($response as $row){
// var_dump($row->row);
echo("PKID: ".$row->pkid)."<br>";
}
?>
Давайте начнем с демонстрации того, что на самом деле является ответом SOAP: для отдельной строки это выглядит так:
object(stdClass)#2 (1) {
["return"]=>
object(stdClass)#3 (1) {
["row"]=>`
object(stdClass)#4 (1) {
["pkid"]=>
string(36) "9dbd9b32-8d64-41ad-a355-8f62e050ffce"
}
}
}
И для нескольких строк:
object(stdClass)#2 (1) {
["return"]=>
object(stdClass)#3 (1) {
["row"]=>
array(2) {
[0]=>
object(stdClass)#4 (1) {
["pkid"]=>
string(36) "fa0540f7-8e75-481b-a193-7a06d7f601a8"
}
[1]=>
object(stdClass)#5 (1) {
["pkid"]=>
string(36) "fa0c8c7a-79be-4667-ae70-c3e773908b52"
}
}
}
}
Проблема здесь в том, что в ответе SOAP объект возвращается несколько раз. Я предполагаю, что PHP назначает целочисленное значение, увеличивающееся каждый раз, когда он его видит. Поэтому, если я хочу добраться до точки, где я могу просто сослаться на PKID, я получу два разных утверждения:
Для одного предмета это:
foreach ($response->return as $row){
var_dump($row->pkid);
}
И для нескольких предметов это:
foreach ($response->return->row as $row){
var_dump($row->pkid);
}
Таким образом, вопрос заключается в том, есть ли для меня способ добиться возврата только значений PKID в моем цикле foreach без предварительной оценки массива? Надеюсь, в этом есть смысл: самопровозглашенный сетевой инженер первый и инфантильный "разработчик" второй.
1 ответ
Все сводится к тому, чтобы сделать php менее умным и гарантировать, что я всегда получу массив обратно.
Замечательно напишите об этом здесь: http://blog.jasonrichardsmith.org/programming/soap-and-single-element-arrays/
Короче говоря, нужно было изменить настройки подключения:
$client = new SoapClient("/var/www/AXLAPI.wsdl",
array('trace'=>true,
'exceptions'=>true,
'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,
'location'=>"https://cups-test:8443/axl",
'login'=>'admin',
'password'=>'password',
));
В том числе 'features'=>SOAP_SINGLE_ELEMENT_ARRAYS,
Команда гарантирует, что даже для единичных результатов она построена как массив, а не как объект.