Webservice mit C# am Beispiel von DHL-Etiketten

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

Mit Webservices lässt sich der Abruf von Daten bestimmter Anbieter aus dem Internet stark vereinfachen. Während Sie etwa zum Herunterladen eines Versandetiketts einige Minuten investieren müssen, um die Adressen und weitere Sendungsdaten aus einer Kundendatenbank in ein Onlineformular zu übertragen, könnten Sie das auch per Mausklick erledigen. Voraussetzung sind einige Zeilen Code und die Registrierung beim entsprechenden Webservice. In diesem Fall schauen wir uns das am Beispiel von Versandetiketten des Paketdienstleisters DHL an.

Im Artikel Webservice testen am Beispiel von DHL haben wir uns bereits angesehen, wie Sie die für einen Webservice benötigte WSDL-Datei ermitteln und damit über ein Tool wie SoapUI die XML-Vorlage für einen Request ermitteln, füllen und testen. Dort haben wir außerdem ein Entwickler-Konto angelegt, mit dem wir auf den Webservice von DHL zugreifen können. Schließlich haben wir einen funktionierenden Aufruf an die Sandbox-Version des Webservice, also eine zu Testzwecken bestimmte Umgebung, abgesetzt und mit dem zurückgelieferten Link ein PDF-Dokument mit dem Versand-etikett erhalten (siehe Bild 1).

Aufruf des Dienstes Intraship

Bild 1: Aufruf des Dienstes Intraship

Nun wollen wir uns die Techniken ansehen, die dafür nötig sind, einen Request an einen Webservice abzusenden und die Antwort auszuwerten. Hier interessiert uns im vorliegenden Beispiel natürlich vor allem, wie wir den Link zum PDF-Dokument mit dem Versandetikett verarbeiten und das PDF-Dokument auf der Festplatte speichern oder ausdrucken.

Anfrage zusammenstellen und abschicken

Wir wollen zunächst den XML-Request, den wir im Artikel Webservice testen am Beispiel von DHL ermittelt haben, an den Webservice schicken und den Request entgegennehmen. Dabei müssen wir natürlich auch noch die Authentifizierung berücksichtigen. Um die Funktion zum Ermitteln des Response-Dokuments aufzurufen, verwenden wir ein Fenster in einer WPF-Anwendung, das wir mit einer entsprechenden Schaltfläche ausstatten.

Diese gibt dann einfach den Code in einem Meldungsfenster aus (siehe Listing 1).

private void btnEinfacherAufruf_Click(object sender, RoutedEventArgs e) {
     MessageBox.Show(GetResponse());
}

Listing 1: Aufruf der Funktion zum Senden eines Requests an den Webservice

Um die verschiedenen nachfolgend verwendeten Klassen zu nutzen, die sich mit dem Umgang mit dem Webservice, mit XML-Dokumenten und mit dem Lesen und Schreiben von Dokumenten beschäftigen, benötigen wir noch drei Namespaces, die wir mit dem using-Schlüsselwort einbinden:

using System.Net;
using System.Xml;
using System.IO;

Die Funktion GetResponse, die den Ablauf steuert, sieht wie folgt aus:

public string GetResponse() {
     HttpWebRequest request = CreateRequest();
     XmlDocument requestXML = GetRequestXML();
     using (Stream stream = request.GetRequestStream()) {
         requestXML.Save(stream);
     }
     using (WebResponse response = request.GetResponse()) {
         using (StreamReader rd = new StreamReader(response.GetResponseStream())) {
             var result = rd.ReadToEnd();
             return result;
         }
     }
}

Hier ermitteln wir mit der Funktion CreateRequest ein neues Objekt des Typs HttpWebRequest und speichern es in der Variablen request. Dabei werden Informationen wie die Header für den Aufruf, die Authentifikation und weitere Informationen in einem Objekt zusammengestellt – mehr dazu weiter unten. Danach füllen wir ein Objekt des Typs XmlDocument namens requestXML, und zwar ebenfalls mithilfe einer Funktion. Diese heißt GetRequestXML und stellt einfach nur das XML-Dokument zusammen, das als Inhalt des Requests verwendet werden soll. Wir haben also nun ein Objekt des Typs HttpWebRequest, welches die Daten für die Steuerung des Requests enthält, und ein XML-Dokument mit dem zu übergebenenen Request.

Nun müssen wir beide noch verheiraten. Dies geschieht im ersten using-Konstrukt der Funktion GetResponse. Das in Klammern hinter der using-Anweisung erzeugte Objekt wird nach dem Durchlaufen des using-Abschnitts wieder gelöscht. In diesem Fall handelt es sich um ein Stream-Objekt. Diesem weisen wir das mit der Funktion GetRequestStream ermittelte Stream-Objekt unseres HttpWebRequest namens request zu. Wir haben also mit stream ein Stream-Objekt referenziert, das wir nun füllen können und so den übergebenen Inhalt als Request-Inhalt an das HttpWebRequest-Objekt übergeben. Dies erledigen wir mit der einzigen Anweisung des using-Konstrukts, mit der wir das in requestXML gespeicherte XML-Objekt in den Stream und somit in das Objekt request speichern.

Das zweite using-Konstrukt ruft dann bereits die Methode GetResponse von request auf und speichert das Ergebnis in der Variablen response mit dem Datentyp WebResponse. response liefert mit GetResponseStream wiederum einen Stream, den wir diesmal allerdings nicht in einem Stream-Objekt speichern, sondern einem StreamReader als Konstruktor-Parameter übergeben. Wir erstellen also ein neues StreamReader-Objekt und weisen diesem den Stream zu, den wir als Antwort des Webservice erhalten haben. Diesen in rd gespeicherten Streamreader kapseln wir wiederum in einem using-Konstrukt, da wir ihn nur für die folgenden beiden Anweisungen benötigen. Die erste liest mit ReadToEnd den kompletten Inhalt des in rd gespeicherten Streams und fügt ihn der Variablen result hinzu. Die Variable result, die zu diesem Zeitpunkt das XML-Dokument mit der Antwort des Webservices enthält, wird dann schließlich als Funktionswert zurückgegeben. Die aufrufende Methode gibt den Inhalt dann schließlich wie in Bild 2 als Meldung aus.

 

Schreibe einen Kommentar