Доступ к веб-сервису SOAP с использованием PHP, содержащего complexType в WSDL - PullRequest
2 голосов
/ 21 сентября 2010

Я хочу позвонить в веб-службу, в которой у меня есть только файл WSDL. Я перечислю важные биты из файла WSDL с контекстно-зависимыми именами, замененными общими:

Функция, которую я хочу вызвать:

<wsdl:operation name="myFunction">
   <wsdl:input message="ns:myFunctionRequest" wsaw:Action="urn:myFunction"/>
   <wsdl:output message="ns:myFunctionResponse" wsaw:Action="urn:myFunctionResponse"/>
</wsdl:operation>

Описание функции:

<xs:element name="myFunction">
   <xs:complexType>
      <xs:sequence>
         <xs:element minOccurs="0" name="param0" nillable="true" type="xs:string"/>
         <xs:element minOccurs="0" name="param1" nillable="true" type="somens:MyType"/>
         <xs:element minOccurs="0" name="param2" nillable="true" type="xs:string"/>
      </xs:sequence>
   </xs:complexType>
</xs:element>

Описание 'MyType':

<xs:complexType name="MyType">
    <xs:sequence>
        <xs:element minOccurs="0" name="date1" nillable="true" type="xs:dateTime"/>
        <xs:element minOccurs="0" name="date2" nillable="true" type="xs:dateTime"/>
        <xs:element minOccurs="0" name="string1" nillable="true" type="xs:string"/>
        <xs:element minOccurs="0" name="int1" nillable="true" type="xs:int"/>
        <xs:element minOccurs="0" name="int2" nillable="true" type="xs:int"/>
    </xs:sequence>
</xs:complexType>

Я думаю, что мой PHP-код выглядит примерно так:

$client = new SOAPClient('my soap URL');

$result = $client->setState(array('param0'=>'bla', 'param1'=><undecided>, 'param2'=>'bla');

Моя проблема в том, что поставить в нерешенную часть. Должен ли это быть массив, который отображает имена в сложном типе в значения? Или это должен быть класс, который я определяю с помощью поля соответствующих типов? У меня нет хороших испытательных площадок, чтобы испытать это в данный момент, и я хотел бы иметь возможность двигаться дальше, прежде чем я получу его в наличии.

Я видел много вопросов, связанных с SOAP, без ответа, поэтому я надеюсь, что мне повезет :). Если мне случится узнать себя, я, конечно, поделюсь своими результатами.

Заранее спасибо!

1 Ответ

2 голосов
/ 21 сентября 2010

По моему опыту, вам нужен объект вместо массива, но stdClass будет достаточно, поэтому вы можете просто привести массив к объекту, если это облегчит жизнь:

$client->myFunction(
    'bla',
    (object)array(
        'date1'   => '2010-01-01 00:00:00',
        'date2'   => '2010-01-02 00:00:00',
        'string1' => 'foobar',
        'int1'    => 1,
        'int2'    => 2
    ),
    'bla');
...