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 :

Communication XMLRPC entre Python et PHP - Probleme de caracteres speciaux


Sujet :

Réseau/Web Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Communication XMLRPC entre Python et PHP - Probleme de caracteres speciaux
    Bonjour,

    J'ai des soucis pour transferer des chaines de caracteres composees de caracteres speciaux.
    Mon serveur est en PHP.
    Si je fais un client PHP, celui-ci communique correctement la chaine.

    Voici le code du serveur PHP:

    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
     
    <?php
     
    include("xmlrpcutils/xmlrpc.inc.php");
    include("xmlrpcutils/xmlrpcs.inc.php");
     
    function getTest($param){
            $fp = fopen("/tmp/debug.xmlrpc.txt","a");
            fwrite($fp, date("d.m.y H:i:s : ")."parametre : ---".$param."---\n");
            fclose($fp);
            return new xmlrpcresp(new xmlrpcval('90', 'int'));
    }
     
    $server = new xmlrpc_server( array(
            "getTest"         => array("function" => "getTest", "signature"          => array(array($xmlrpcInt, $xmlrpcString)))
        ),false);
     
    $server->functions_parameters_type = 'phpvals';
    $server->response_charset_encoding = 'ISO-8859-1';
    $server->service();
     
    ?>
    et mon client PHP qui fonctionne parfaitement.

    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
     
    <?php
    include "xmlrpcutils/xmlrpc.inc.php";
     
    $xmlrpc_client = new xmlrpc_client('/server_test.php','monserveur',80); 
     
    // 2: CONSTRUCT THE REQUEST (AN XML-RPC MESSAGE) 
     
    $xmlrpc_msg = new xmlrpcmsg('getTest', array(new xmlrpcval('caractères','string'))); 
     
    // 3: SEND THE REQUEST 
     
    $xmlrpc_resp = $xmlrpc_client->send($xmlrpc_msg); 
     
    // 4: WORKING WITH THE SERVER'S RESPONSE 
     
    if ($xmlrpc_resp == False) // check for successful transaction 
    	die('error message'); 
     
    if (!$xmlrpc_resp->faultCode()) { 
     
     
    }?>
    et voici mon client python qui n'envoit pas les données correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import xmlrpclib
     
    server = xmlrpclib.Server('http://monserveur/server_test.php');
     
    machaine = "Ceci est un test avec des caractères très spéciaux..."
    result = server.getTest(machaine)
    print "Result:", result
    Mes caractères non ascii sont d'office remplacés par des "?".

    Une idée serait la bienvenue.
    Merci d'avance.

    J

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 420
    Points : 36 997
    Points
    36 997
    Par défaut
    Salut,
    Ben on commence par lire la URL="http://docs.python.org/library/xmlrpclib.html"]doc[/URL] de la bibliothèque Python 2.7 qui indique:
    class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime]]]]])
    .... The optional third argument is an encoding, by default UTF-8.
    ...
    Et on essaie pour voir.

    XML-RPC échange des documents XML.

    Ceux ci supportent des encodings autre que le défaut (utf-8) modulo que cela soit précisé dans l'entête du document échangé.

    Ceci dit, le XML n'est utilisé que pour faire du RPC et non transporter n'importe quel document XML "en général"... le sous ensemble du XML utilisé est suffisamment "réduit" pour que le code se passe de l'assistance d'une bibliothèque XML "normale". Ce qui permet de réduire les dépendances.

    => Est-il "judicieux" dans ce cas de changer le défaut pour 'ISO-8859-1' côté PHP?

    - W

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour la proposition, mais en retirant la ligne de code precisant le charset employe, et donc en gardant celui par defaut, cela ne change rien.

    le resultat est toujours le meme.
    Une autre idee?

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    une idee quelqu'un?

    avez-vous le meme comportement chez vous?

    Merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 420
    Points : 36 997
    Points
    36 997
    Par défaut
    Salut

    Citation Envoyé par j_bxl Voir le message
    Merci pour la proposition, mais en retirant la ligne de code precisant le charset employe, et donc en gardant celui par defaut, cela ne change rien.
    Reprenez le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    machaine = "Ceci est un test avec des caractères très spéciaux..."
    result = server.getTest(machaine)
    print "Result:", result
    print n'étant pas fonction indique que vous travaillez en Python 2.x.
    D'autre part, seule la console admet d'avaler des caractères "accentués" sans qu'ait été précisé l'encoding du source Python.
    "machaine" contient alors un tableau de bytes et non une string unicode.
    A partir de là, c'est quoi le type de la chaîne de caractère accepté par .getTest et retournée par getTest?

    => ce que fait le script d'une ligne à l'autre n'est déjà pas très clair - ce n'est pas votre faute, le sujet est compliqué - alors pour ce qui est de bavarder avec un serveur PHP...

    Prenons un serveur XMLRPC "Python" - pas de PHP sous la main - mais le but est d'écrire un client Python non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import xmlrpclib
    from SimpleXMLRPCServer import SimpleXMLRPCServer
     
    def echo(s):
        assert type(s) is unicode
        return u">> " + s
     
    server = SimpleXMLRPCServer(("localhost", 8000))
    print "Listening on port 8000..."
    server.register_function(echo, "echo")
    server.serve_forever()
    note: "echo" se contente de vérifier qu'on lui a donné de l'unicode et il retourne la même chose préfixée par u">> "

    Le client Python pourrait ressembler à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # -*- coding: utf-8 -*-
     
    import xmlrpclib
    proxy = xmlrpclib.ServerProxy("http://localhost:8000/")
    result = proxy.echo(u'éé')
    print 'result', result.encode('cp437')
    - W

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci pour cette reponse.

    Entre un serveur Python et un client Python, pas de souci.
    De meme, entre un serveur PHP et un client PHP, pas de souci.

    Le probleme semble donc resider dans l'intercommunication entre php et python, meme si la couche employee (xmlrpc) est censee etre universelle...

    quelqu'un a-t-il l'occasion de faire le test chez lui? c'est peut-etre un probleme de librairies de mon cote (PHP ou Python).

    J

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 420
    Points : 36 997
    Points
    36 997
    Par défaut
    Salut,

    Citation Envoyé par j_bxl Voir le message
    Le probleme semble donc resider dans l'intercommunication entre php et python, meme si la couche employee (xmlrpc) est censee etre universelle...
    D'après vos tests, ça ne communique pas si mal lorsqu'on échange de l'ASCII.
    Mais c'est plus délicat lorsque vous échangez autre chose.
    i.e XMLRPC "fonctionne" mais dans ce cas, c'est pas évident.

    quelqu'un a-t-il l'occasion de faire le test chez lui? c'est peut-etre un probleme de librairies de mon cote (PHP ou Python).
    Fa

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant CRM
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant CRM

    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    je confirme. de l'ascii, pas de soucis.
    Ca se complique lorsque l'on essaie de transferer des caracteres unicode.

    quelqu'un a deja fait ca?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 420
    Points : 36 997
    Points
    36 997
    Par défaut
    Salut,

    J'ai eu des soucis pour terminer ma réponse d'hier.

    Ca se complique lorsque l'on essaie de transferer des caracteres unicode.
    Excusez moi mais lire "transférer des caractères unicode" suggère que vous ne réalisez pas encore la hauteur de la marche qu'il faut franchir lorsqu'on sort de l'univers confortable de l'ASCII.

    Pas de commentaire là dessus! apprendre passe souvent par faire violence à ses idées reçues: à vous de voir.
    Je ne puis qu'essayer de vous montrer comment on peut essayer de répondre à ce type de question.

    Modifiez simplement le code du client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # -*- coding: utf-8 -*-
    import xmlrpclib
    proxy = xmlrpclib.ServerProxy("http://localhost:8000/", verbose=True)
    result = proxy.echo(u'éé')
    assert isinstance(result, unicode)
    print 'result', result.encode('cp437')
    1. les "chaines de caractères" passées en paramètre à la methode echo exposée par le serveur sont effectivement Unicode.
    2. "verbose = True" pour visualiser les messages échangés entre client et serveur.
    note: si vous n'avez pas confiance sur la "trace" obtenue, utilisez un wireshark pour regarder les trames protocolaires...

    L'exécution montrera ce qui est expédié et reçu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    send: "POST / HTTP/1.1\r\nHost: localhost:8000\r\nAccept-Encoding: gzip\r\nUser-
    Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com)\r\nContent-Type: text/xml\r\nC
    ontent-Length: 152\r\n\r\n<?xml version='1.0'?>\n<methodCall>\n<methodName>echo<
    /methodName>\n<params>\n<param>\n<value><string>\xc3\xa9\xc3\xa9</string></value
    >\n</param>\n</params>\n</methodCall>\n"
    reply: 'HTTP/1.0 200 OK\r\n'
    header: Server: BaseHTTP/0.3 Python/2.7.1
    header: Date: Thu, 03 Nov 2011 10:34:38 GMT
    header: Content-type: text/xml
    header: Content-length: 139
    body: "<?xml version='1.0'?>\n<methodResponse>\n<params>\n<param>\n<value><strin
    g>&gt;&gt; \xc3\xa9\xc3\xa9</string></value>\n</param>\n</params>\n</methodRespo
    nse>\n"
    result >> éé
    L'unicode est échangé après avoir été encodé utf-8 entre client et serveur.
    Ce qui clos (provisoirement) les questions côté Python.

    Ca donne quoi avec votre "serveur" PHP?

    Bon courage
    - W

Discussions similaires

  1. [Débutant] Problème de caractères spéciaux
    Par chaabane dans le forum Mise en forme
    Réponses: 4
    Dernier message: 22/08/2007, 00h22
  2. Problème de caractères spéciaux
    Par cflo91 dans le forum Mise en forme
    Réponses: 9
    Dernier message: 14/08/2007, 16h02
  3. Probleme avec caractere speciaux
    Par blairswish dans le forum Langage SQL
    Réponses: 9
    Dernier message: 16/12/2006, 23h47
  4. [HQL]Problème quand caractères spéciaux.
    Par Dimitri S. dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/10/2006, 17h48
  5. Réponses: 3
    Dernier message: 27/09/2006, 12h41

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