Home » Tutorials » Netzwerk und Internet » Webservice-Client

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“

  1. 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!

    1. 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 —

Kommentare sind geschlossen.