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

Web Perl Discussion :

[SOAP::Lite] Mauvais arguments d'une fonction ?


Sujet :

Web Perl

  1. #1
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut [SOAP::Lite] Mauvais arguments d'une fonction ?
    Bonjour à tous,

    Je code actuellement un client utilisant un Web Service avec SOAP (j'utilise donc le package SOAP::Lite). J'ai déployé le service côté serveur en local avec Axis. Rien de bien problématique, et le service de base d'Axis (j'ai nommé Version) s'appelle de la manière suivante chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Connexion pour essai
    $ws = SOAP::Lite 
    -> proxy('http://localhost:9000/axis/services/')
    -> service('http://localhost:9000/axis/services/Version?wsdl');
    print $ws -> getVersion(), "\n";
    Ceci fonctionne et me renvoie :
    Apache Axis version: 1.4
    Built on Jan 18, 2006 (05:05:47 CET)
    Nickel !

    Je veux donc utiliser mon webservice à moi, en y faisant appel de la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my $proxy = 'http://localhost:8080/axis/services/';
    my $service = 'http://localhost:8080/axis/services/mon_service?wsdl';
    # Recuperation du wsdl du service :
    print "Connecting to web service...";
    $ws = SOAP::Lite 
    -> proxy($proxy)
    -> service($service);
    print "..";
    # Connexion au web service proprement dit :
    $uid = $ws ->  connect('mon_login','mon_passwd');
    print "..\nuid de l'API : $uid\n";
    À l'exécution, je récupère bien le wsdl (les 5 premiers points de suspension sont affichés), puis à l'appel de la méthode connect on me renvoie l'erreur :
    404 Not Found at /home/a_po/mon_chemin/bin/../lib/libMonApi.pm line 74
    Qu'en pensez-vous ? L'appel à la même fonction depuis mon navigateur web fonctionne et nostre Firefox chéri nous renvoie un beau XML... J'avoue que je ne comprends pas.
    Cela fonctionne notamment si je fais dans le navigateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://localhost:9000/axis/services/arcsys?method=connect&login=arcsys42super&password=infotel0
    Étrange non ? Le chemin est sensé exister, et je récupère bien le wsdl... ^^

    Merci d'avance pour votre aide !
    Hayiiiiiiiiiiiiii !

  2. #2
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Bonjour,
    j'ai un peu avancé, et en analysant les paquets du réseau j'ai trouvé que le paquet de requête pour la méthode connect était envoyé au mauvais endroit... une erreur dans le wsdl, que j'ai corrigé (pas bien, celui qui l'avait fait ), et maintenant le paquet http contenant le fiichier XML est envoyé au bon endroit.

    J'ai testé avec une application python qui avait déjà été développée, cela fonctionne. Par contre, il y a une chose que je ne comprends pas : le script python ne récupère apparemment pas le fichier wsdl lorsque j'analyse les paquets qui transitent. Est-ce ainsi que l'on doit faire, ne pas récupérer le wsdl ? Car moi, je fais mes appels ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        $ws = SOAP::Lite 
        -> uri('urn:Version')
        -> proxy($protocol.$host.$port.'/axis/servlet/AxisServlet')
        -> service($protocol.$host.$port.'/axis/services/Version?wsdl')
        ;
        print $ws -> getVersion(), "\n";
    (Je dirais que la réponse est non)
    Hayiiiiiiiiiiiiii !

  3. #3
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Je me réponds à moi-même : a priori, la réponse est non mais on peut faire de différentes manières.

    Pour mon problème, c'est RÉSOLU, il fallait en fait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        $ws = SOAP::Lite 
            -> uri('urn:Version')
            -> proxy($protocol.$host.$port.'/axis/services/Version')
            ;
        print $ws -> getVersion() -> result, "\n";
    Hayiiiiiiiiiiiiii !

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 44
    Points
    44
    Par défaut
    J'ai fait un exemple de service web développé en J2EE et j'ai pensé a avoir un client Java et un client PERL. Le probléme était que je n'ai pas trouvé aucune maniére de faire passer un paramétre a une fonction correctement pour le cas de perl. Pour Java c'est ok.

    Exemple d'utilisation :

    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
     
    use SOAP::Lite;
    use Data::Dumper;
    use SOAP::Lite 'trace';
     
     
    my $client=SOAP::Lite->uri('http://execution.validation.cec.st.com/')
    		   ->proxy('http://tun.st.com:8080/JobExecutionService/JobExecutionService');
     
    my $var=SOAP::Data->type('string');
    $var->name('name');
    $var->value('it is ok');
     
    print $var."\n";
     
    my $result=$client->Hello($var);
     
    unless($result->fault){
    print $result->result();
    }
    else
    {
    print join ',',
    	$result->faultcode,
    	$result->faultstring,
    	$result->faultdetail;
    }


    Voila le message de retour que j'obtiens :l'enveloppe en mode request est ok ( pour passage de paramétre), en retour je n'ai rien meme en meme débogage de ce service, si je fais un print a l'intérieur de la fonction je trouve un null.


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    SOAP::Transport::new: ()
    SOAP::Serializer::new: ()
    SOAP::Deserializer::new: ()
    SOAP::Parser::new: ()
    SOAP::Lite::new: ()
    SOAP::Transport::HTTP::Client::new: ()
    SOAP::Data::new: ()
    SOAP::Data=HASH(0x863a184)
    SOAP::Lite::call: ()
    SOAP::Serializer::envelope: ()
    SOAP::Serializer::envelope: Hello SOAP::Data=HASH(0x863a184)
    SOAP::Data::new: ()
    SOAP::Data::new: ()
    SOAP::Data::new: ()
    SOAP::Data::new: ()
    SOAP::Data::new: ()
    SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH(0x863a07c)
    SOAP::Transport::HTTP::Client::send_receive: POST http://tun.st.com:8080/JobExecutionService/JobExecutionService HTTP/1.1
    Accept: text/xml
    Accept: multipart/*
    Accept: application/soap
    Content-Length: 473
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "http://execution.validation.cec.st.com/#Hello"
     
    <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Hello xmlns="http://execution.validation.cec.st.com/"><name xsi:type="xsd:string">it is ok</name></Hello></soap:Body></soap:Envelope>
    SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x876e62c)
    SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
    Connection: close
    Date: Thu, 31 Jul 2008 15:14:46 GMT
    Server: Sun Java System Application Server 9.1_02
    Content-Type: text/xml;charset="utf-8"
    Client-Date: Thu, 31 Jul 2008 15:14:46 GMT
    Client-Peer: 164.130.63.158:8080
    Client-Response-Num: 1
    X-Powered-By: Servlet/2.5
     
    <?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:HelloResponse xmlns:ns2="http://execution.validation.cec.st.com/"/></S:Body></S:Envelope>
    SOAP::Deserializer::deserialize: ()
    SOAP::Parser::decode: ()
    SOAP::SOM::new: ()
    SOAP::SOM::DESTROY: ()
    SOAP::Lite::DESTROY: ()
    SOAP::Deserializer::DESTROY: ()
    SOAP::Parser::DESTROY: ()
    SOAP::Transport::DESTROY: ()
    SOAP::Transport::HTTP::Client::DESTROY: ()
    SOAP::Serializer::DESTROY: ()
    SOAP::Data::DESTROY: ()
    SOAP::Data::DESTROY: ()
    SOAP::Data::DESTROY: ()
    SOAP::Data::DESTROY: ()
    SOAP::Data::DESTROY: ()
    SOAP::Data::DESTROY: ()

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 44
    Points
    44
    Par défaut
    votre aide s'il vous plait ! j'en ai besoin car je suis bloqué depuis un long moment.

    Y a t il quelque chose qui peut m'aider dans ce sujet.

    Cordialement,

  6. #6
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Salut,
    Je ne m'y connais pas excessivement plus que ce que j'ai mis précédemment ; par contre si j'ai bien compris c'est le passage d'arguments qui pose problème ?
    Et si au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $var=SOAP::Data->type('string');
    $var->name('name');
    $var->value('it is ok');
     
    print $var."\n";
               
    my $result=$client->Hello($var);
    tu mettais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $var = 'it is ok';
    my $result=$client->Hello($var);
    ?

    J'aurais tendance à croire que c'est peut-être l'objet SOAP::Data qui poserait problème. En fait, dans les clients que j'ai faits je n'ai jamais vraiment eu besoin d'utiliser ce SOAP::Data. Moins clean, mais en tous cas ça marche pour moi.

    Ensuite, si ça ne marche pas, es-tu sûr que ta déclaration de ton objet SOAP::Lite est bonne ?
    Si au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $client=SOAP::Lite->uri('http://execution.validation.cec.st.com/')
               ->proxy('http://tun.st.com:8080/JobExecutionService/JobExecutionService');
    tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $client=SOAP::Lite->uri('urn:JobExecutionService')
              ->proxy('http://tun.st.com:8080/JobExecutionService/JobExecutionService');
    Qu'est-ce que ça donne ?


    EDIT : Le nom de ton webservice, c'est bien JobExecutionService ? Essaie bien de mettre comme uri "urn:nom_de_ton_service".
    Hayiiiiiiiiiiiiii !

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 44
    Points
    44
    Par défaut
    Salut,

    les modifications ne m'ont pas permis d'avancer dans ce topic.
    Chose bizarre dans ce message c'est que j'ai unb 'Connection closed' dans mon message SOAP. C'est peu etre bloquant ?

    Je ne sais pas comment m'en sortir.

    Merci d'avance pour ton aide,

  8. #8
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 44
    Points
    44
    Par défaut
    Salut,

    Je suis arrivé a faire le fix vu que le problème était lié a un fait namespace, c'est le point qui m'a bloqué.

    Le problème est maintenant résolu.

  9. #9
    Membre actif
    Avatar de Le Barde
    Homme Profil pro
    Chanteur
    Inscrit en
    Juillet 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Chanteur

    Informations forums :
    Inscription : Juillet 2007
    Messages : 343
    Points : 259
    Points
    259
    Par défaut
    Ah cool ! J'en profite moi aussi pour mettre Résolu.
    Et merci aussi, je t'ai piqué à ton insu des petits bouts de code
    Hayiiiiiiiiiiiiii !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E] Lister les arguments d'une fonction
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/02/2006, 12h04
  2. Récupération d'arguments sur une fonction
    Par p0Kep0K dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 21/09/2005, 09h17
  3. premier argument d'une fonction
    Par Ickou dans le forum Langage
    Réponses: 3
    Dernier message: 10/09/2005, 14h17
  4. une url comme argument d'une fonction
    Par khayyam90 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/10/2004, 20h15
  5. passer FILE* en argument d une fonction
    Par Monsieur_Manu dans le forum C
    Réponses: 9
    Dernier message: 10/04/2003, 17h56

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