2010-09-21 25 views
2

Je souhaite passer un appel à un service Web dont je n'ai que le fichier WSDL. Je vais énumérer les bits importants du fichier WSDL avec des noms sensibles au contexte remplacés par des généraux:Accéder à un service Web SOAP en utilisant PHP contenant un complexType dans le WSDL

La fonction que je veux appeler:

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

La description de la fonction:

<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> 

La description de '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> 

Je pense à mon code PHP recherche un peu lik e ceci:

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

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

Mon problème est quoi mettre dans la partie indécis. Est-ce que cela devrait être un tableau qui met en correspondance les noms du type complexe avec les valeurs? Ou devrait-il être une classe que je définis moi-même avec le champ des types correspondants? Je n'ai pas un bon terrain d'essai pour l'essayer en ce moment et j'aimerais pouvoir passer à autre chose avant de l'avoir disponible.

J'ai vu beaucoup de questions liées au SOAP sans réponse, alors j'espère que j'aurai de la chance :). Si je découvre moi-même, je partagerai bien sûr mes résultats.

Merci d'avance!

Répondre

2

Dans mon expérience, vous avez besoin d'un objet au lieu d'un tableau, mais stdClass suffit, donc vous pouvez juste jeter un tableau pour s'y opposer si elle rend la vie plus facile:

$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'); 
+0

Merci! C'est très concis et précis. Exactement ce dont j'avais besoin. Je ferai un autre commentaire ici pour confirmer que cela a fonctionné quand je dois pouvoir le tester. –

+0

Je l'ai testé et ça a marché. –

+0

Allé de l'horen & dank je voor de beleefdheid om même le melden de het inderdaad werkte de niet, dat heeft helaas niet iedereen;) – Wrikken