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