IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau/Web Python Discussion :

SOAP: envoyer un dictionnaire


Sujet :

Réseau/Web Python

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut SOAP: envoyer un dictionnaire
    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:
    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 );
    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é).
    Parmi mes tentatives vaines:
    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
    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
    <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'},
    		...
    	]
    }
    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
    <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}
                    ...
    	]
    }
    Merci d'avance pour l'aide que vous pourrez m'apporter.


    EDIT: j'ai trouvé une solution alternative, mais bien crade: envoyer le flux xml de la requête directement

    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())
    Si quelqu'un a mieux, je suis preneur!
    Dernière modification par Invité ; 12/06/2013 à 14h16.

Discussions similaires

  1. Capturer les message SOAP envoyé par le code client
    Par jamelledine_med dans le forum Services Web
    Réponses: 3
    Dernier message: 14/07/2010, 09h20
  2. Envoyer un Soap dans Excel et mettre l'acquittement dans une cellule
    Par akdmks dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/02/2008, 17h35
  3. [Web Service][SOAP] Envoyer des fichiers volumineux via web services
    Par kaboume dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/12/2007, 11h06
  4. [XML] Comment envoyer un flux XML avec SOAP et PHP5 ?
    Par lehic dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 15/06/2007, 16h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo