Оценка 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, Команда гарантирует, что даже для единичных результатов она построена как массив, а не как объект.

Другие вопросы по тегам