{"id":55000082,"date":"2017-04-01T00:00:00","date_gmt":"2020-03-27T19:25:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=82"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Webservice_mit_C_am_Beispiel_von_DHLEtiketten","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Webservice_mit_C_am_Beispiel_von_DHLEtiketten\/","title":{"rendered":"Webservice mit C# am Beispiel von DHL-Etiketten"},"content":{"rendered":"<p><b>Mit Webservices l&auml;sst sich der Abruf von Daten bestimmter Anbieter aus dem Internet stark vereinfachen. W&auml;hrend Sie etwa zum Herunterladen eines Versandetiketts einige Minuten investieren m&uuml;ssen, um die Adressen und weitere Sendungsdaten aus einer Kundendatenbank in ein Onlineformular zu &uuml;bertragen, k&ouml;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.<\/b><\/p>\n<p>Im Artikel <b>Webservice testen am Beispiel von DHL <\/b>haben wir uns bereits angesehen, wie Sie die f&uuml;r einen Webservice ben&ouml;tigte WSDL-Datei ermitteln und damit &uuml;ber ein Tool wie SoapUI die XML-Vorlage f&uuml;r einen Request ermitteln, f&uuml;llen und testen. Dort haben wir au&szlig;erdem ein Entwickler-Konto angelegt, mit dem wir auf den Webservice von DHL zugreifen k&ouml;nnen. Schlie&szlig;lich haben wir einen funktionierenden Aufruf an die Sandbox-Version des Webservice, also eine zu Testzwecken bestimmte Umgebung, abgesetzt und mit dem zur&uuml;ckgelieferten Link ein PDF-Dokument mit dem Versand-etikett erhalten (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_82_001.png\" alt=\"Aufruf des Dienstes Intraship\" width=\"424,7115\" height=\"664,4005\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Aufruf des Dienstes Intraship<\/span><\/b><\/p>\n<p>Nun wollen wir uns die Techniken ansehen, die daf&uuml;r n&ouml;tig sind, einen Request an einen Webservice abzusenden und die Antwort auszuwerten. Hier interessiert uns im vorliegenden Beispiel nat&uuml;rlich vor allem, wie wir den Link zum PDF-Dokument mit dem Versandetikett verarbeiten und das PDF-Dokument auf der Festplatte speichern oder ausdrucken.<\/p>\n<h2>Anfrage zusammenstellen und abschicken<\/h2>\n<p>Wir wollen zun&auml;chst den XML-Request, den wir im Artikel <b>Webservice testen am Beispiel von DHL <\/b>ermittelt haben, an den Webservice schicken und den Request entgegennehmen. Dabei m&uuml;ssen wir nat&uuml;rlich auch noch die Authentifizierung ber&uuml;cksichtigen. Um die Funktion zum Ermitteln des Response-Dokuments aufzurufen, verwenden wir ein Fenster in einer WPF-Anwendung, das wir mit einer entsprechenden Schaltfl&auml;che ausstatten.<\/p>\n<p>Diese gibt dann einfach den Code in einem Meldungsfenster aus (siehe Listing 1).<\/p>\n<pre>private void btnEinfacherAufruf_Click(object sender, RoutedEventArgs e) {\r\n     MessageBox.Show(GetResponse());\r\n}<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Aufruf der Funktion zum Senden eines Requests an den Webservice<\/span><\/b><\/p>\n<p>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&auml;ftigen, ben&ouml;tigen wir noch drei Namespaces, die wir mit dem <b>using<\/b>-Schl&uuml;sselwort einbinden:<\/p>\n<pre>using System.Net;\r\nusing System.Xml;\r\nusing System.IO;<\/pre>\n<p>Die Funktion <b>GetResponse<\/b>, die den Ablauf steuert, sieht wie folgt aus:<\/p>\n<pre>public string GetResponse() {\r\n     HttpWebRequest request = CreateRequest();\r\n     XmlDocument requestXML = GetRequestXML();\r\n     using (Stream stream = request.GetRequestStream()) {\r\n         requestXML.Save(stream);\r\n     }\r\n     using (WebResponse response = request.GetResponse()) {\r\n         using (StreamReader rd = new StreamReader(response.GetResponseStream())) {\r\n             var result = rd.ReadToEnd();\r\n             return result;\r\n         }\r\n     }\r\n}<\/pre>\n<p>Hier ermitteln wir mit der Funktion <b>CreateRequest <\/b>ein neues Objekt des Typs <b>HttpWebRequest <\/b>und speichern es in der Variablen <b>request<\/b>. Dabei werden Informationen wie die Header f&uuml;r den Aufruf, die Authentifikation und weitere Informationen in einem Objekt zusammengestellt &#8211; mehr dazu weiter unten. Danach f&uuml;llen wir ein Objekt des Typs <b>XmlDocument <\/b>namens <b>requestXML<\/b>, und zwar ebenfalls mithilfe einer Funktion. Diese hei&szlig;t <b>GetRequestXML <\/b>und stellt einfach nur das XML-Dokument zusammen, das als Inhalt des Requests verwendet werden soll. Wir haben also nun ein Objekt des Typs <b>HttpWebRequest<\/b>, welches die Daten f&uuml;r die Steuerung des Requests enth&auml;lt, und ein XML-Dokument mit dem zu &uuml;bergebenenen Request.<\/p>\n<p>Nun m&uuml;ssen wir beide noch verheiraten. Dies geschieht im ersten <b>using<\/b>-Konstrukt der Funktion <b>GetResponse<\/b>. Das in Klammern hinter der <b>using<\/b>-Anweisung erzeugte Objekt wird nach dem Durchlaufen des <b>using<\/b>-Abschnitts wieder gel&ouml;scht. In diesem Fall handelt es sich um ein <b>Stream<\/b>-Objekt. Diesem weisen wir das mit der Funktion <b>GetRequestStream <\/b>ermittelte <b>Stream<\/b>-Objekt unseres <b>HttpWebRequest <\/b>namens <b>request <\/b>zu. Wir haben also mit <b>stream <\/b>ein <b>Stream<\/b>-Objekt referenziert, das wir nun f&uuml;llen k&ouml;nnen und so den &uuml;bergebenen Inhalt als Request-Inhalt an das <b>HttpWebRequest<\/b>-Objekt &uuml;bergeben. Dies erledigen wir mit der einzigen Anweisung des <b>using<\/b>-Konstrukts, mit der wir das in <b>requestXML <\/b>gespeicherte XML-Objekt in den Stream und somit in das Objekt <b>request <\/b>speichern.<\/p>\n<p>Das zweite <b>using<\/b>-Konstrukt ruft dann bereits die Methode <b>GetResponse <\/b>von <b>request <\/b>auf und speichert das Ergebnis in der Variablen <b>response <\/b>mit dem Datentyp <b>WebResponse<\/b>. <b>response <\/b>liefert mit <b>GetResponseStream <\/b>wiederum einen Stream, den wir diesmal allerdings nicht in einem <b>Stream<\/b>-Objekt speichern, sondern einem <b>StreamReader <\/b>als Konstruktor-Parameter &uuml;bergeben. Wir erstellen also ein neues <b>StreamReader<\/b>-Objekt und weisen diesem den Stream zu, den wir als Antwort des Webservice erhalten haben. Diesen in <b>rd <\/b>gespeicherten Streamreader kapseln wir wiederum in einem <b>using<\/b>-Konstrukt, da wir ihn nur f&uuml;r die folgenden beiden Anweisungen ben&ouml;tigen. Die erste liest mit <b>ReadToEnd <\/b>den kompletten Inhalt des in <b>rd <\/b>gespeicherten Streams und f&uuml;gt ihn der Variablen <b>result <\/b>hinzu. Die Variable <b>result<\/b>, die zu diesem Zeitpunkt das XML-Dokument mit der Antwort des Webservices enth&auml;lt, wird dann schlie&szlig;lich als Funktionswert zur&uuml;ckgegeben. Die aufrufende Methode gibt den Inhalt dann schlie&szlig;lich wie in Bild 2 als Meldung aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_82_002.png\" alt=\"Ergebnis des Requests\" width=\"424,7115\" height=\"855,5786\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Ergebnis des Requests<\/span><\/b><\/p>\n<h2>Request zusammenstellen<\/h2>\n<p>Die Funktion <b>CreateRequest <\/b>stellt den Request zusammen und gibt diesen als <b>HttpWebRequest<\/b>-Objekt an die aufrufende Instanz zur&uuml;ck. Dabei legt diese zun&auml;chst ein <b>Uri<\/b>-Objekt an und hinterlegt die Uri, die als Endpunkt f&uuml;r den Webservice dient (hier der Request f&uuml;r die Sandbox: <b>https:\/\/cig.dhl.de\/services\/sandbox\/soap<\/b>). Danach erstellt sie das <b>HttpWeb-Request<\/b>-Objekt auf Basis der Methode <b>Create <\/b>der Klasse <b>WebRequest<\/b>. Dieser &uuml;bergibt sie das <b>Uri<\/b>-Objekt mit dem Endpunkt als Parameter. Das Ergebnis wird schlie&szlig;lich in den Typ <b>HttpWebRequest <\/b>umgewandelt. Danach stellt die Funktion die Zeichenkette f&uuml;r die Authentifizierung zusammen. Der Benutzername und das Kennwort werden zun&auml;chst in die Variablen <b>username <\/b>und <b>password <\/b>geschrieben (sp&auml;ter fragen Sie die Daten entweder ab oder speichern direkt die kodierte Form), durch einen Doppelpunkt voneinander getrennt in einer neuen Zeichenkette aufgenommen und in einen Base64-String umgewandelt. Das Ergebnis landet in der Variablen <b>auth<\/b>. Danach f&uuml;gt die <b>Add<\/b>-Methode der <b>Headers<\/b>-Auflistung des in <b>request <\/b>gespeicherten <b>WebHttpRequest<\/b>-Objekts einen neuen Header mit dem Namen <b>Authorization <\/b>und dem aus der Zeichenkette <b>Basic<\/b>, einem Leerzeichen und der kodierten Version aus Benutzername und Kennwort als Wert hinzu. Danach legt sie noch die Eigenschaften <b>ContentType <\/b>(<b>text\/xml;charset=&#8221;utf-8&#8243;<\/b>), <b>Accept <\/b>(<b>text\/xml<\/b>) und <b>Method <\/b>(<b>POST<\/b>) von <b>request <\/b>fest. Danach gibt die Methode den Inhalt der Objektvariablen <b>request<\/b> an die aufrufende Methode zur&uuml;ck:<\/p>\n<pre>public HttpWebRequest CreateRequest() {\r\n     Uri uri = new Uri(\"https:\/\/cig.dhl.de\/services\/sandbox\/soap\");\r\n     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@uri);\r\n     String username = \"andreminhorst\";\r\n     String password = \"*********\";\r\n     String auth = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(username + \":\" + password));\r\n     request.Headers.Add(\"Authorization\", \"Basic \" + auth);\r\n     request.ContentType = \"text\/xml;charset=\\\"utf-8\\\"\";\r\n     request.Accept = \"text\/xml\";\r\n     request.Method = \"POST\";\r\n     return request;\r\n}<\/pre>\n<h2>XML-Dokument zusammenstellen<\/h2>\n<p>Damit kommen wir zur letzten Funktionsmethode, die wir f&uuml;r den ersten Aufruf ben&ouml;tigen. Diese hei&szlig;t <b>GetRequestXML <\/b>und erstellt zun&auml;chst ein neues Objekt des Typs <b>XmlDocument<\/b>. Die Variable f&uuml;r dieses Objekt hei&szlig;t <b>requestXML<\/b>.<\/p>\n<p>Es soll nun mit dem als Zeichenkette vorhandenen XML-Dokument gef&uuml;llt werden, welches wir im Artikel <b>Webservice testen am Beispiel von DHL <\/b>zusammengestellt und ausprobiert haben. Diese Zeichenkette laden wir mit der Methode <b>LoadXml <\/b>in das Objekt <b>requestXML <\/b>und geben dieses als R&uuml;ckgabewert an die aufrufende Methode zur&uuml;ck:<\/p>\n<pre>public XmlDocument GetRequestXML() {\r\n     XmlDocument requestXML = new XmlDocument();\r\n     requestXML.LoadXml(@\"&lt;soapenv:Envelope ...&gt;\r\n         &lt;soapenv:Header&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;        &lt;cis:Authentification&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;        &lt;cis:user&gt;2222222222_01&lt;\/cis:user&gt;\r\n                 &lt;cis:signature&gt;pass&lt;\/cis:signature&gt;\r\n             &lt;\/cis:Authentification&gt;\r\n         &lt;\/soapenv:Header&gt;\r\n         ---\r\n     &lt;\/soapenv:Envelope&gt;\");\r\n     return requestXML;\r\n}<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000082\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000082?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000082\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"123b777de9\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit Webservices l&auml;sst sich der Abruf von Daten bestimmter Anbieter aus dem Internet stark vereinfachen. W&auml;hrend Sie etwa zum Herunterladen eines Versandetiketts einige Minuten investieren m&uuml;ssen, um die Adressen und weitere Sendungsdaten aus einer Kundendatenbank in ein Onlineformular zu &uuml;bertragen, k&ouml;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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022017,662017,44000012,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000082","post","type-post","status-publish","format-standard","hentry","category-66022017","category-662017","category-Interaktiv","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000082","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000082"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000082\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000082"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}