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 & réseau Delphi Discussion :

Tests de webservices


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut Tests de webservices
    Bonjour,
    Je dois effectuer un travail avec des WebServices sous Delphi 6 et pour me mettre dans le bains, j'essaie de créer un client pour des webservices déjà existant.

    J'ai trouvé le service suivant qui me paraît bien pour quelques tests:
    http://www.webservicex.net/WS/WSDeta...SID=17&CATID=7
    Il permet de connaître des informations sur des pays



    Dans mon projet Delphi, j'ai créer un nouvel importateur WSDL pour ce webservice et une petite forme avec un bouton qui interroge le service.

    Le but de mon petit programme et de lire la liste de tous les pays du webservice puis pour chaque pays, je lis les détails et les affiche dans un Memo. J'utilise un composant THTTPRIO pour accéder au WebService

    Voici mon code :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    procedure TForm1.Button3Click(Sender: TObject);
    Var
       res,CountryCode,CountryCurr,CountryGMT,CountryISD,CountryName : String;
       J : Integer;
     
       //Permet de mettre en page le résultat sous forme de liste de nom
       function parseRes(Res_ : String) : String;
       Var
          I : INteger;
          Ouvert : Boolean;
       Begin
            Ouvert:=False;
            Res_:=StringReplace(Res_,#0,'',[rfReplaceAll, rfIgnoreCase]);
            Res_:=StringReplace(Res_,#$D,'',[rfReplaceAll, rfIgnoreCase]);
            Res_:=StringReplace(Res_,#$A,'',[rfReplaceAll, rfIgnoreCase]);
     
            Result:='';
            For I:=0 To Length(Res_) Do
            Begin
                 If Res_[I] = '<' Then Ouvert:=True;
     
                 If Ouvert = False Then
                 If Res_[I] <> #0 Then
     
                 Result:=Result+Res_[I];
                 If Res_[I] = '>' Then
                 Begin
                      Ouvert:=False;
                      Result:=Result+#13+#10;
                 End;
            End;
       End;
     
    begin
         Memo3.Clear;
         Memo4.Clear;
     
         //Liste des pays disponibles sur le WebService
         Res:=(HTTPRIO2 as countrySoap).GetCountries;
         //Affichage de la liste des pays
         Memo3.Text:=(parseRes(res));
     
         //Suppression des lignes vides
         For J:=Memo3.Lines.Count-1 DownTo 0 Do
         If Trim(Memo3.Lines[J])='' Then
         Memo3.Lines.Delete(J);
     
         //--- Jusqu'ici, tout fonctionne bien
     
         //Affichage des détails de chaque pays
         For J:=0 To Memo3.Lines.Count-1 Do
         Begin
              Try
                 CountryName:=Trim(Memo3.Lines[J]);
                 CountryCode:=(HTTPRIO2 as countrySoap).GetISOCountryCodeByCountyName(CountryName);
                 CountryCurr:=(HTTPRIO2 as countrySoap).GetCurrencyByCountry(CountryName);
                 CountryGMT:=(HTTPRIO2 as countrySoap).GetGMTbyCountry(CountryName);
                 CountryISD:=(HTTPRIO2 as countrySoap).GetISD(CountryName);
              Except
                    Break;
              End;
     
              Memo4.Lines.Add(CountryName+' - '+CountryCode+' - '+CountryCurr+' - '+CountryGMT+' - '+CountryISD);
         End;
         ShowMessage('Fin');
    end;
    Pas de problème pour la liste des pays, tout fonctionne. Mon problème arrive quand je demande les détails d'un pays, j'ai l'exception suivante :


    Le projet a provoqué une exception de type ERemotableException avec le message 'System.Web.Services.Protocols.SoapException : Server was unable to process request. --->System.Data.SqlClient.SQLException : Procedure or function 'GetISOCountryCodeByCountyName' Expects parameter '@name', which was not supplied.
    at WebServicex.country.GetISOCountryCodeByCountryName(String CountryName)
    --- End of inner exception stack trace ---'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    L'exception est retournée pour n'importe quelle information (Code, GMT, ISD, Currency).

    Est-ce une erreur interne au WebService? Est-ce que quelqu'un a une idée de la cause ou d'une solution à mon problème?

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    c'est un problème de lien entre le client et le server, essaye de regénérer la WSDL en modifiant les options sur le paramètres litéraux !
    Perso, je préconise l'utilisation des paramètres "encoded", plus verbeux mais plus fiable !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut
    Merci de ta réponse ShaiLeTroll. mais je ne suis pas sure d'avoir tout compris, comment est-ce je peux régénérer un fichier WSDL si ce n'est pas moi qui gère la partie serveur du WebService ?

    Je ne créer que le client, le webservice que j'utilise est déjà existant en libre utilisation sur Internet.

    Ou alors est-ce que je dois faire les modifications directement dans l'unité .PAS qui a été générée automatiquement depuis l'importateur WSDL et qui est liée à mon projet Delphi?

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Oui, je parlais du .pas généré par l'importateur WSDL

    Regarde l'option "Generate Literal Types" et l'option "Unwind des paramètres littéraux", j'en parle dans ma question : "Importateur WSDL + Option Literal = Comportement non souhaité ! "

    Regarde aussi ce sujet "D6+Webservices+problème avec le message SOAP généré"

    Joue un peu avec, le bon code est un mélange des deux en fait, cela solutionné mes problèmes en tout cas !

    Faut espérer qu'il attend bien CountryName et pas Name comme paramètre des différentes fonctions !
    le WS semble envoyer une erreur SQL Préparée avec un paramètre Name manquant ...

    Ah, j'ai regardé la WSDL, c'est en litéral ! Perso, j'ai toujours des merdes avec le litéral !

    télécharge le WSDL, enregistre le dans un fichier

    remplace tous les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap12:body use="literal" />
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <soap12:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
    Regénère le .pas avec ce WSDL modifié, cela devrait donner un meilleur résultat, a peu près le même que cela en jouant avec les options et RegisterSerializeOptions(xoLiteralParam)

    C'est un problème commun à D6 et D7, en D2009, tout ça est résolu, l'importateur est plus complet (je l'ai utilisé pour générer mon .pas, je l'ai retouché à la main pour l'utiliser en D7) et bcp de bug sur le format des variables et résolu (comme les dates, la résolution des énumérations, ...)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Concernant ce pb il me semble que j'étais tombé sur une mise à jour, relativement récente, concernant D7 sur le site de Embarcadero. Avec réserve toutefois...

  6. #6
    Membre éclairé
    Femme Profil pro
    Inscrit en
    Avril 2007
    Messages
    209
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2007
    Messages : 209
    Par défaut
    J'ai tenté de faire les modifications proposées par ShaiLeTroll en modifiant les options d'importation du WSDL et j'obtiens désormais une unité d'interfaces qui ressemble à celle proposée dans
    http://www.developpez.net/forums/d75...-non-souhaite/

    A savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      countrySoap = interface(IInvokable)
      ['{8DBC1A5E-EE9E-A914-A471-25BEA58B2E1A}']
        function  GetCountryByCountryCode(const parameters: GetCountryByCountryCode): GetCountryByCountryCodeResponse; stdcall;
        function  GetISD(const parameters: GetISD): GetISDResponse; stdcall;
        function  GetCountries(const parameters: GetCountries): GetCountriesResponse; stdcall;
        function  GetCurrencyCodeByCurrencyName(const parameters: GetCurrencyCodeByCurrencyName): GetCurrencyCodeByCurrencyNameResponse; stdcall;
        function  GetISOCountryCodeByCountyName(const parameters: GetISOCountryCodeByCountyName): GetISOCountryCodeByCountyNameResponse; stdcall;
        function  GetCurrencyCode(const parameters: GetCurrencyCode): GetCurrencyCodeResponse; stdcall;
        function  GetCountryByCurrencyCode(const parameters: GetCountryByCurrencyCode): GetCountryByCurrencyCodeResponse; stdcall;
        function  GetCurrencies(const parameters: GetCurrencies): GetCurrenciesResponse; stdcall;
        function  GetCurrencyByCountry(const parameters: GetCurrencyByCountry): GetCurrencyByCountryResponse; stdcall;
        function  GetGMTbyCountry(const parameters: GetGMTbyCountry): GetGMTbyCountryResponse; stdcall;
      end;
    J'ai adapté mon code à la situation et je rencontre un nouveau problème. La fonction GetCountries fonctionne toujours parfaitement et me retourne la même chose que précédemment.

    Mon problème se situe lors du passage de paramètres à l'une des fonctions qui nécessite le nom du pays. j'ai le petit code suivant

    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
     
    procedure TForm1.Button7Click(Sender: TObject);
    Var
       par1 : GetISOCountryCodeByCountyName;
       Res1 : GetISOCountryCodeByCountyNameResponse;
       CountryName,CountryCode : AnsiString;
    begin
         Try
            CountryName:='Switzerland';
            par1:=GetISOCountryCodeByCountyName.Create;
            Res1:=GetISOCountryCodeByCountyNameResponse.Create;
            par1.CountryName:=CountryName;
            Res1:=(HTTPRIO2 as countrySoap).GetISOCountryCodeByCountyName(par1);
            CountryCode:=Res1.GetISOCountryCodeByCountyNameResult;
            par1.Free;
            Res1.Free;
         Except
               On E:Exception Do
               Memo4.Text:=E.Message;
         End;
    end;
    Et au moment de l'appel de la fonction GetISOCountryCodeByCountyNameResult, j'obtiens l'exception suivante:
    //Violation d'accès à l'adresse 004A9ACE dans le module 'Project1.exe'. Lecture de l'adresse 00000000
    Qui semble désormais venir directement de Delphi et non du WebService. En fait ces nouveaux types de paramètres me perturbes un peu (C'était plus compréhensible avant avec des string, ... mais bon ça marchait pas ) J'ai essayé plusieurs possibilités. et j'avoue que je sèche un peu sur celle-là, des idées?

    Merci d'avance

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/06/2010, 12h43
  2. JAX-WS Test du webservice
    Par Invité dans le forum Services Web
    Réponses: 6
    Dernier message: 26/04/2010, 00h10
  3. Maven et test des webservices
    Par fredop dans le forum Maven
    Réponses: 1
    Dernier message: 07/03/2010, 11h16
  4. Best practice et/ou stratégie de test de webservice
    Par jdvacheron dans le forum Maven
    Réponses: 3
    Dernier message: 21/09/2007, 14h45
  5. Maven, test des webservices à installer
    Par jdvacheron dans le forum Maven
    Réponses: 4
    Dernier message: 21/09/2007, 13h58

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