Bonjour à tous
J'a besoin d'utiliser une API externe qui fonctionne via SOAP (en l'occurrence celle de BookMyName, dont la doc est ici: http://api.doc.bookmyname.com/ ), et ce en utilisant Python. J'arrive à me connecter, j'arrive à exécuter correctement certaines requêtes, mais... dès qu'une requête demande un dictionnaire en paramètre, je plante.
Pourtant, les exemples donnés en PHP sur la doc semblent très simples d'accès:
Dans mon implémentation, j'ai utilisé SOAPpy (je ne suis pas parvenu à utiliser Suds parce qu'il ne s'agit pas d'une conf WDSL, mais je n'ai peut-être pas assez cherché de ce côté).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $newdomain = array( "domain" => $domain, "period" => 1, "owner_id" => $id, ... ); $result = $client->domain_create( $dist_id, $dist_passwd, $newdomain );
Parmi mes tentatives vaines:
Pour info, voici ce à quoi ressemble un dictionnaire qui arrive du serveur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 domain_struct = { 'domain' : "google.fr", 'period' : "1", ... } #Error: Cannot use object of type stdClass as array domain_struct2 = SOAPpy.structType() for i,j in domain_struct.iteritems(): domain_struct2._addItem(i, j) #Error: Cannot use object of type stdClass as array domain_struct3 = SOAPpy.structType(name='value') for i,j in domain_struct.iteritems(): tmp = SOAPpy.structType(name='item') domain_struct3._addItem(tmp._name, tmp) tmp._addItem(j, i) #Error: Cannot use object of type stdClass as array domain_struct4 = SOAPpy.buildSOAP(domain_struct3) #Error: la requête envoie un string, qui n'est pas interprété comme un tableau par le serveur
Je n'ai pas réussi à reconstruire un tel objet avec les méthodes de SOAPpy, le mieux que j'ai pu faire étant la construction domain_struct3 qui a la forme suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <SOAPpy.Types.structType value at 39641216>:{ 'item':[ <SOAPpy.Types.structType item at 39620080>: {'value': 1, 'key': 'fm'}, <SOAPpy.Types.structType item at 39619400>: {'value': 0, 'key': 'es'}, <SOAPpy.Types.structType item at 39618680>: {'value': 0, 'key': 'de'}, ... ] }
Merci d'avance pour l'aide que vous pourrez m'apporter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <SOAPpy.Types.structType value at 39826456>:{ 'item':[ <SOAPpy.Types.structType item at 39841840>: {'domain': 'google.fr'}, <SOAPpy.Types.structType item at 39842640>: {'owner_id': 122} ... ] }
EDIT: j'ai trouvé une solution alternative, mais bien crade: envoyer le flux xml de la requête directement
Si quelqu'un a mieux, je suis preneur!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 string="""<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://api.dev.bookmyname.com/apis.cgi" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <ns1:domain_create> <param0 xsi:type="xsd:string">XXXXX</param0> <param1 xsi:type="xsd:string">XXXXX</param1> <param2 xsi:type="ns2:Map"> <item> <key xsi:type="xsd:string">domain</key> <value xsi:type="xsd:string">google.fr</value> </item> <item> <key xsi:type="xsd:string">period</key> <value xsi:type="xsd:int">1</value> </item> <item> <key xsi:type="xsd:string">owner_id</key> <value xsi:type="xsd:string">1</value> </item> ... </param2> </ns1:domain_create> </SOAP-ENV:Body> </SOAP-ENV:Envelope> """ r = urllib2.Request("http://api.dev.bookmyname.com/apis.cgi", data=string, headers={'Content-Type': 'application/xml'}) u = urllib2.urlopen(r) response = fromstring(u.read())
Partager