Как мне использовать веб-сервис, возвращающий сложные типы в PHP?
-
23-09-2019 - |
Вопрос
Я использую PHP 5.2.10 и я пытаюсь использовать веб-сервис, который возвращает сложные типы данных используя стандартное расширение SOAP.
Проблема в том, что SoapClient не заполняет объекты, вложенные в другие объекты/массив объектов.Упрощенный пример того, что я получаю, когда вызываю метод getUtente, указывая «my_unique_id» в качестве параметра:
stdClass Object
(
[getUtenteReturn] => stdClass Object
(
[userName] => my_unique_id
[fieldOne] => ...
[fieldTwo] => ...
[utilizzatore] => stdClass Object
( // This is EMPTY instead of containing a series of userName's
)
)
)
Соответствующая часть описания WDSL:
<element name="getUtenteResponse">
<complexType>
<sequence>
<element name="getUtenteReturn" type="tns1:Cliente"/>
</sequence>
</complexType>
</element>
...
<complexType name="Utilizzatore">
<sequence>
<element name="userName" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
...
<complexType name="Cliente">
<complexContent>
<extension base="tns1:Utilizzatore">
<sequence>
<element name="fieldOne" nillable="true" type="xsd:string"/>
<element name="fieldTwo" nillable="true" type="xsd:string"/>
<element name="utilizzatore" nillable="true" type="impl:ArrayOf_tns1_Utilizzatore"/>
</sequence>
</extension>
</complexContent>
</complexType>
Что я обнаружил, я не единственный, кто испытывает эту проблему.В частности я нашел этот комментарий в официальной документации PHP и эта другая запись на форуме предложить две разные идеи о том, как подойти к проблеме, но мне не удалось реализовать ни одну из этих двух идеи в рабочее решение:Кажется, я не совсем понимаю логику приведенных примеров.
Я был бы признателен, если бы кто-нибудь мог помочь мне в этом:некоторый рабочий код на другом веб-сервисе был бы желателен, но в первую очередь мне нужно действительно понять проблему и логику предлагаемых решений (рыбный переулок, а не рыба!).:)
Решение
Старый вопрос, ответа нет.Недавно я наткнулся на этот пост, который объясняет проблему и дает решение: Использование веб-сервиса SOAP complexType с PHP.
Другие советы
Вот мои ближайшие мысли, извините, это неправильный ответ, просто некоторые идеи...
Во-первых, пробовали ли вы просмотреть запрос мыла (конверт), отправленный на сервер мыла?Похоже, это должно сработать?Вы видите, где что-то идет не так?Вы просто получаете ошибку, мыльную ошибку, неправильные данные или вообще ничего?
Во-вторых, пробовали ли вы использовать SoapParam
сорт?
Наконец, я уверен, что вы делаете это правильно, но я заметил, что объект, который вы создаете, имеет имя пользователя, а также fieldOne и fieldTwo, расположенные рядом, но ваш WSDL показывает, что fieldOne и fieldTwo являются частью класса Cliente (который никогда не появляется в вашем примере), в то время как имя пользователя должно находиться внутри массива utilizzatore, поэтому не должно ли оно быть больше похоже на:
stdClass Object
(
[Cliente] => stdClass Object
(
[fieldOne] => ...
[fieldTwo] => ...
[utilizzatore] => stdClass Object
( // This is EMPTY instead of containing a series of userName's
)
)
)
Класс SoapClient меня очень расстраивает, поэтому не воспринимайте это как критику, потому что я лишь надеюсь лучше понять его сам, предложив идеи, которые могут вам помочь.
Мак, большое спасибо за быстрые ответы.посмотри на что я упал..Я не смотрел на это раньше.Поэтому хочу поделиться этот.