PHP-клиентский массив строк возвращается как пустой объект - PullRequest
0 голосов
/ 03 ноября 2011

Хорошо, у меня есть мыльный клиент php, который вызывает метод и правильно получает некоторую информацию, он может захватывать простые типы, такие как строки или даже объекты, но когда он переходит к массиву некоторого типа (в данном случае Strings), он всегда возвращается как пустой объект. Я пытался привести его к массиву и ко многим другим вещам, но каждый параметр, который я использую, всегда возвращает одно и то же.

Вот некоторая справочная информация:

Это веб-сервис, который я создал в java с помощью eclipse. Я также автоматически сгенерировал Java-клиент для тестирования веб-службы перед созданием клиента в php. Я создал несколько тестовых случаев, которые использовали автоматически сгенерированный Java-клиент (прокси-класс) и успешно вернули правильное ожидаемое значение. Другими словами, у java не было проблем с тем, чтобы взять этот массив строк и показать мне каждое значение. Я сделал это, чтобы определить, была ли проблема на стороне сервера или на стороне клиента, и пока она больше указывает на сторону клиента.

Далее, у мыльного клиента php есть хорошая функция, где, если вы установите опции для включения ("trace" => 1), вы можете вызвать __getLastResponse (), чтобы посмотреть, как выглядит ответ xml, так что вот оно:

< ?xml version="1.0" encoding="utf-8"?>
< soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    < soapenv:Body>
        < getAllCarClassesIdsAsWsCarClassIdsResponse xmlns="X">
            < getAllCarClassesIdsAsWsCarClassIdsReturn>
                < carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                    < carClassIds>X< /carClassIds>
                < /carClassIds>
            < /getAllCarClassesIdsAsWsCarClassIdsReturn>
        < /getAllCarClassesIdsAsWsCarClassIdsResponse>
    < /soapenv:Body>
< /soapenv:Envelope>

Обратите внимание, что некоторые значения были заменены на X в целях безопасности. Кроме того, у xml есть дополнительный пробел после открывающей скобки, потому что я не мог найти способ разместить xml иначе. Прошу прощения, если трудно читать.

Дело в том, что в ответе указаны правильные значения (эти X должны быть в массиве строк), но вместо этого я все еще вижу пустой объект. Ниже приводится var_dump объекта полного ответа:

object(WsCarClassIds)#4 (1) {
   ["carClassIds"]=>
  object(stdClass)#5 (0) {
  }
}

Ниже приведен var_dump объекта после использования на нем get_object_vars ():

array(1) {
  ["carClassIds"]=>
  object(stdClass)#5 (0) {
  }
}

А ниже - var_dump объекта, за которым следует var_dump, приведенная к массиву с использованием (array) $ carClassIds:

object(stdClass)#5 (0) {
}
array(0) {
}

В случае, если информация полезна, вот фрагмент файла wsdl, который содержит «сложный тип», который должен быть массивом строк:

< complexType name="ArrayOf_xsd_string">
    < sequence>
     < element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd:string"/>
    < /sequence>
   < /complexType>

Кроме того, я хочу добавить, что я уже пытался добавить функцию «SOAP_USE_XSI_ARRAY_TYPE» внутри массива параметров при создании экземпляра SOAP-клиента. На многих форумах было предложено заняться десерализацией «ArrayOf_xsd_string». Добавление опции не дало эффекта.

Я также попытался добавить это в начало моего кода: ini_set ('soap.wsdl_cache_enabled', 0); Что говорит клиенту отключить кэширование wsdl, что также не привело к изменениям.

Я поместил здесь много информации, но я готов поместить все, что может понадобиться для решения этой проблемы. Я работал над этим почти 2 полных, очень долгих дня и, похоже, не могу найти решение. Любая помощь будет высоко ценится, спасибо.

-Asaf

1 Ответ

0 голосов
/ 04 ноября 2011

Итак, я смог найти решение проблемы. Видите, я использовал класс оси веб-сервиса eclipse по умолчанию, более старую версию. Я не использовал Axis 2, которая, очевидно, новее. Не удивительно, что способ преобразования кода Java в файл WSDL был другим.

После обновления до создания веб-службы с использованием Axis 2 вместо этого php-клиент смог правильно прочитать массивы. Вероятно, клиент php ожидал файл wsdl в более новом формате и не знал, как интерпретировать старый.

Это последний раз, когда я позволяю другому программисту убедить меня использовать систему так, как он ее настраивал, вместо обновления до последней версии (потому что он ленив, его слова, а не мои).

-Asaf

...