使用包含WSDL中的complexType的PHP访问SOAP Webservice

时间:2010-09-21 15:58:42

标签: php web-services soap wsdl complextype

我想调用一个我只有WSDL文件的webservice。我将列出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 个答案:

答案 0 :(得分:2)

根据我的经验,你需要一个对象而不是一个数组,但是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');