Webservice-Client
Projekt: IP-Adresse in Land umwandeln
Fangen wir also an: Wir wollen ein Programm erstellen, das zu einer frei eingebbaren IP-Adresse das Land ausgibt.
Vorbereitung
Wie gewohnt, erstellen wir in Delphi über das Menü Datei/Neu eine neue Anwendung.
Dann können wir die Oberfläche des Hauptfensters mit ein paar Komponenten versehen: Wir brauchen ein Edit-Feld für die Eingabe der IP-Adresse, einen Button zum Abschicken und ein Label zur Anzeige des Ergebnisses.
WSDL importieren
Alle Operationen, die wir am Webservice durchführen können, sind in der Schnittstellenbeschreibung der WSDL-Datei aufgeführt. Allerdings eben in der Web Service Description Language, nicht in Form einer Delphi-Unit. Aber Delphi wäre nicht Delphi, wenn es dazu keine Lösung gäbe.
Über das Menü Datei/Neu öffnen wir die Objektgalerie und klicken auf die Registerseite „WebServices“. Dort finden wir den WSDL-Import-Assistenten:
In das Eingabefeld geben wir die URL der gewünschten WSDL-Datei ein: http://www.ecubicle.net/iptocountry.asmx?wsdl. Nach Klick auf „Weiter“ lädt Delphi diese Datei herunter, und wir erhalten eine Übersicht über die Typen und Schnittstellen. Und wenn wir den Assistenten über „Fertigstellen“ abgeschlossen haben, steht uns die Delphi-Übersetzung der WSDL-Datei zur Verfügung. Neben dem reinen Interface wird auch Delphi-Code implementiert, der über eine Instanz von THTTPRIO eine Verbindung zum Webservice aufbaut.
Unser Code
Das ist alles, was Delphi für uns tun kann. Für die Programmlogik sind wir noch immer selbst zuständig. Alles, was wir selbst schreiben müssen, gehört in die Ereignisbehandlungsroutine OnClick des Buttons.
Als erstes müssen wir eine aufrufbare Schnittstelle von der generierten Funktion anfordern:
function GetIpToCountrySoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IpToCountrySoap;
Alle drei Parameter sind optional.
Nun haben wir das Interface, an dem wir die Funktion FindCountryAsString aufrufen können. Diese Funktion benötigt einen Parameter, nämlich eine IP-Adresse.
Als Ergebnis erhalten wir einen String, der leider XML enthält und nicht nur das Land als reinen String. Für eine saubere Darstellung müssten wir diesen String also noch parsen. Dieses Verhalten ist bei jedem Webservice anders. Manche liefern auch Objekte zurück, die in der WSDL definiert sind.
In unserem Fall ensteht der folgende Code:
uses IpToCountry; ... procedure TForm1.Button1Click(Sender: TObject); var ip: IpToCountrySoap; begin ip := GetIpToCountrySoap(true); Label1.Caption := ip.FindCountryAsString(Edit1.Text); end;
4 Gedanken zu „Webservice-Client“
Kommentare sind geschlossen.
Danke für dieses sehr gelungene Tutorial.
Die im Text angegebene WSDL-Datei existiert offenbar nicht mehr. Ich konnte das Tutorial aber mit der folgenden Adresse beenden:
http://www.webservicex.net/geoipservice.asmx?WSDL
Das interface ist etwas anders, aber einfach anzupassen.
Nochmals, Danke!
Vielen Dank für die Info!
Ein echt gelungenes Tutorial! Leider enthält es nicht die Übergabe von Authentifizierungsparametern wie Username und Password. Im Netz ist dazu auch nicht wirklich viel hilfreiches zu finden. Vielleicht gibt es dazu bald hier eine Ergänzung?
Das wäre echt toll!
Die Anpassung ist für mich nicht so einfach.
So sieht mein Aufruf aus:
procedure TFormWebService.btStartClick(Sender: TObject);
var
i : GeoIPServiceSoap;
begin
i := GetGeoIPServiceSoap (true);
ShowMessage (‚START IP: ‚ + edIP.Text);
lblLand.Caption := i.GetGeoIP(edIP.Text).CountryName;
end;
Fehlermeldung:
System.Web.Services.Protocols.SoapExecptions: Server was unable to
process request —> System.ArgumentNullExecption: Value cannot be
null.
Parameter name: input
at System.Text.RegularExpressions.Regex.IsMatch(Strin input)
at WebserviceX.Service.Adapter.IPAdapter.CheckIP(String IP)
at WebServiceX.Service,GeoIPService.GetGeoIP(String IPAddress)
— End of inner exception stack trace —