Bonjour à tous,
Je suis en train de bosser sur soap (client et serveur) & wsdl, ça fonctionne mais pas dans les règles de l'art et particulièrement sur la question des données structurées.
=> Lorsque j’exécute la méthode \SoapClient::__getFunctions() sur mon instance je me retrouvais avec des informations sur les types à UNKNOWN dans les description des méthodes.
Exemple de retour __getFunctions :
UNKNOWN getProducts(string $Auth_Username, string $Auth_Password, UNKNOWN $Mpns)
Du coup j'ai bossé les données structurées du fichier wsdl pour finalement réussir à obtenir les informations sur les types de données de la méthode:
ProductStockArray getProducts(string $Auth_Username, string $Auth_Password, MpnListType $Mpns)
Mais une chose me chagrine, mes valeurs de retour sont de simples tableaux, Ou, en bidouillant la méthode de retour, un tableau contenant un objet StdClass mais dont la structure ne reflète pas que je j'ai mis en place dans le typage/données structurées.
Je penses donc que soit je ne réalises pas bien la structure dans le wsdl soit que ma méthode "getProducts" ne renvois pas correctement les données...
(Pour appeler la méthode je passe en argument 3 éléments $Auth_Username, $Auth_Password et une liste $Mpns[...], mais vue le comportement de retour je pense que j'ai également mal structuré les données en entrées)
Voici ce que j'attends en retour de ma méthode : Un tableau contenant N objets (ou un objet contenant les objets enfants)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| array(3){
[0]=> object(stdClass) (2) {
["mpn"]=>
string(6) "149156"
["qty"]=>
int(1)
}
[1]=> object(stdClass) (2) {
["mpn"]=>
string(6) "149157"
["qty"]=>
int(20)
}
[2]=> object(stdClass) (2) {
["mpn"]=>
string(6) "149158"
["qty"]=>
int(3)
}
} |
Voici les données structurées du fichier wsdl (elements message et types) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| //données en entrée de la methode
<message name="getProducts">
<part name="Auth_Username" type="xsd:string"/>
<part name="Auth_Password" type="xsd:string"/>
<part name="Mpns" type="xsd:MpnListType"/>
</message>
//données de retour de la méthode
<message name="getProductsResponse">
<part name="getProductsResult" type="xsd:ProductStockArray"/>
</message>
<types>
//Structure des données de retour
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://md.local/soap-server/server/product/">
<element name="ProductStock" >
<complexType>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="mpn" type="xsd:string"/>
<element name="qty" type="xsd:integer"/>
</sequence>
</complexType>
</element>
<complexType name="ProductStockArray">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="tns:ProductStock[]"/>
</restriction>
</complexContent>
</complexType>
<element name="OutputProduct" type="ProductStockArray"/>
</schema>
//Structure des données en entrée de la methode
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://md.local/soap-server/server/product/">
<complexType name="MpnListType">
<sequence maxOccurs="unbounded">
<element name="mpn" type="xsd:string"/>
</sequence>
</complexType>
<element name="MpnList" type="MpnListType"/>
</schema>
</types> |
Et voici ma méthode de classe getProducts :
1 2 3 4 5 6
| public function getProducts($Auth_Username, $Auth_Password,$mpns) {
return array_filter(array_map(function($e)use($mpns){
return in_array($e['mpn'],$mpns)?$e:null;
}, static::$products))
;
} |
Dans cette méthode j'ai bien tenté de renvoyer des objets plutôt que des tableaux de données ce qui fonctionne mais ne me permet pas d'obtenir les données structurées correctement:
1 2 3 4 5 6 7
| public function getProducts($Auth_Username, $Auth_Password,$mpns) {
$list = array_filter(array_map(function($e)use($mpns){
return in_array($e['mpn'],$mpns)?new ProductStock($e['mpn'],$e['qty']):null;
}, static::$products));
return new ProductStockArray($list);
} |
J'ai beau retourner le tout dans tout les sens je n'arrive pas a résoudre l'équation...
D'autant que je ne vois pas l'utilité des données structurées si la réponse de la méthode n'est pas formatée tels que spécifié dans les données structurées.
Si quelqu'un à un avis sur la question, je dois passer a côté de quelque chose.
Puis bon si vous avez des liens intéressant ou que vous voyez des choses étranges n'hésitez pas, je me fais la main et j'ai donc dut faire des erreurs ici ou là (c'est même certain).
Un grand merci ^^
Partager