Как мне использовать веб-сервис, возвращающий complexTypes в PHP? - PullRequest
0 голосов
/ 28 января 2010

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

Буду признателен, если кто-нибудь поможет мне в этом: будет приветствоваться некоторый рабочий код на другом веб-сервисе, но в первую очередь мне нужно действительно понять проблему и логику предлагаемых решений («рыбная дорожка», а не рыба!). :)

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Старый вопрос, без ответа. Недавно я наткнулся на этот пост, который объясняет проблему и дает решение: Использование веб-службы SOAP complexType с PHP .

0 голосов
/ 17 февраля 2010

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

0 голосов
/ 09 февраля 2010

Вот мои непосредственные мысли, извините, это не правильный ответ, просто некоторые идеи ...

Сначала вы пытались просмотреть запрос на мыло (конверт), отправленный на сервер мыла? Похоже, это должно работать? Вы видите, где это идет не так? Вы только что вернули ошибку, soapFault или неверные данные, или ничего вообще?

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

...