Как мне использовать веб-сервис, возвращающий сложные типы в PHP?

StackOverflow https://stackoverflow.com/questions/2154062

Вопрос

Я использую 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 меня очень расстраивает, поэтому не воспринимайте это как критику, потому что я лишь надеюсь лучше понять его сам, предложив идеи, которые могут вам помочь.

Мак, большое спасибо за быстрые ответы.посмотри на что я упал..Я не смотрел на это раньше.Поэтому хочу поделиться этот.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top