httpClient / SOAP / XML

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
asim
Rookie
Rookie
Beiträge: 7
Registriert: Di, 05. Nov 2019 12:23

httpClient / SOAP / XML

Beitrag von asim »

Hallo Zusammen,
ich bin neu in diesem Forum und das ist meine erste Nachricht im Xbase-Forum.
Ich versuche mit httpClient() eine SOAP Request aber irgendwie funktioniert es nicht. In der Hilfe von Xbase steht auch nicht viel, das Beispiel dort liefert beim Ausführen einen Fehler.
Meine Frage: muss ich einen WebServer haben um einen httpClient-Request auszuführen oder geht es auch ohne?
Ich möchte ein DHL-Etikett erzeugen, ich schicke meine Daten an DHL-Server als SOAP-Request und der Server muss mir eine PDF-Datei schicken. Aber ich weiss nicht wo ich einen Fehler mache.
loadfromurl() hilft mir auch nicht weiter.
Vielleicht hat jemand einen Beispiel Code um einen SOAP-Request erfolgreich zu testen, das wurde mir weiter helfen.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Martin Altmann »

Moin,
herzlich Willkommen hier im Forum.
Ich weiß nicht, wie das bei DHL läuft - aber im Normalfall bekommst Du bei solchen Anfragen als Ergebnis einen link für das fertige Dokument, das aber erst noch erstellt wird (und somit zum Zeitpunkt der Antwort noch nicht unbedingt sofort verfügbar ist).
Du könntest dann mittels LoadFromURL() versuchen, die Datei hinter dem link herunterzuladen - solange, bis es klappt (Du also nicht einen Fehlercode zurückbekommst).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Jan »

Hallo asim,

ich mache recht viel mit HTTPClient und SOAP. Natürlich geht das ohne Webserver. Aber man muß natürlich das Protokoll kennen. Mit LoadFromUrl() wirst Du vermutlich nicht weiter kommen, weil der kein (soweit ich weiß) SOAP kann.

Ich mach zwar einiges mit GLS per SOAP, aber das sieht natürlich anders aus als bei DHL. Wenn Du mir die Doku von DHL zukommen läßt, dann werf ich da gerne mal einen Blick rein.

Wo sitzt Du denn? Gibt es eventuell eine XUG in der Gegend, die man bei einem Treffen mal fragen könnte?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Tom »

SOAP ist letztlich ein simpler HTTP-POST-Request, der einer bestimmten Notation genügt, mit einem XML-Envelope und dem Request selbst als eingebetteter XML- oder JSON-Struktur. Ich mache das mit Xb2.Net, da erzeugt man einen HTTP-Client, generiert den Request und sendet ihn per :Execute() an den Server. Die Antwort (Response) ist dann wieder eine XML-Struktur, die man auswerten kann.

Um das auszuprobieren, bevor man sich in seiner App verstrickt, empfehle ich SoapUI (www.soapui.org). Die kostenlose Version kann ausreichend viel für die meisten Anwendungsfälle. Man kann sich - insofern vorhanden - über das WSDL, also die Beschreibung der Schnittstelle, hier sämtliche Requests generieren lassen und sie testen. Allerdings wird auf ganz unterschiedliche Arten authentifiziert, das ist manchmal ein bisschen fummelig. Es gibt SOAP-Server, über die holt man sich per Login zuerst ein Token, über den man dann die eigentlichen Requests ausführen kann, andere erzeugen beim ersten Login Cookies, die man allen weiteren Requests mitgeben muss, dritte enthalten bei jedem Request die Authentifizierung (zuweilen als Header).
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Tom »

Hier ist die DHL-Schnittstelle erklärt, unter Einsatz von SoapUI: https://shop.minhorst.com/know-how/date ... el-von-dhl Wenn man das in SoapUI lädt, sieht man alle Requests, kann die Variablen bestücken und die Ergebnisse kontrollieren. Und wenn man damit fertig ist, baut man's in die eigene Software ein.
Die WSDL-Datei gibt's hier:
https://cig.dhl.de/cig-wsdls/com/dpdhl/ ... i-2.2.wsdl
Herzlich,
Tom
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Jan »

Ach, der Herr Minhorst. Von dem habe ich auch ein paar Bücher zu Hause stehen.

Tom hat natürlich Recht. REST und SOAP sind sehr ähnlich. In der Handhabung gibt es für mich drei Unterschiede:
  • SOAP kann (normalerweise) nur XML. REST meist JSON und XML.
  • Und bei SOAP muß man den Request in eine XML packen, an die Richtige Adresse schicken, und den Namen der dort benutzen Funktion per oHC:httpRequest:setHeader("SOAPAction", "uri:" + cFunktion) in den HTTPClient einbauen, und ebenfalls ein oHC:httpRequest:setContent(cXml) einbauen um die XML mit der Anfrage unterzubringen.
  • Und während es bei REST neben der Rückgabe (JSON oder XML) zusätzlich noch die HTML-Codes gibt (200 = OK, etc.) ist das zumindest bei den SOAP, die ich bislang nutze, nicht so. Da muß man die zurückgegebene XML auswerten um zu erfahren, ob das geklappt hat oder nicht.
Die Abfrage bei GLS sieht dann z. B. so aus:

Code: Alles auswählen

oHC := HttpClient():new("http://www.gls-group.eu:80/276-I-PORTAL-WEBSERVICE/services/Tracking")
oHC:setAcceptType("text/xml")
oHC:setAcceptCharSet("utf-8")
oHC:httpRequest:setHeader("SOAPAction", "uri:TUListOperation")
oHC:httpRequest:setMethod("POST")
oHC:httpRequest:setContent(cXml)
cResult := oHC:send()
cResult ist dann die XML, die hier GLS mir zurück gibt. Und die ich mit XmlSimpleParser(cResult) in ein Objekt wandle, das ich dann sauber abarbeiten kann. Achtung: Das ist kein DataObject! Das muß man also etwas anders auseinander nehmen.


Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: httpClient / SOAP / XML

Beitrag von Werner_Bayern »

Servus Asim,

Du musst Dich im DHL-Entwicklerportal als Entwickler registrieren, dann bekommst Du ein Token und Zugriff auf die Schnittstellenbeschreibung (Geschäftskundenversand-API, alles SOAP). Dann kannst es mit loadfromurl() oder besser mit HTTPClient() benutzen - siehe Anmerkungen von Tom.
es grüßt

Werner

<when the music is over, turn off the lights!>
asim
Rookie
Rookie
Beiträge: 7
Registriert: Di, 05. Nov 2019 12:23

Re: httpClient / SOAP / XML

Beitrag von asim »

Jan hat geschrieben: Di, 05. Nov 2019 14:23 Hallo asim,

ich mache recht viel mit HTTPClient und SOAP. Natürlich geht das ohne Webserver. Aber man muß natürlich das Protokoll kennen. Mit LoadFromUrl() wirst Du vermutlich nicht weiter kommen, weil der kein (soweit ich weiß) SOAP kann.

Ich mach zwar einiges mit GLS per SOAP, aber das sieht natürlich anders aus als bei DHL. Wenn Du mir die Doku von DHL zukommen läßt, dann werf ich da gerne mal einen Blick rein.

Wo sitzt Du denn? Gibt es eventuell eine XUG in der Gegend, die man bei einem Treffen mal fragen könnte?

Jan
Hallo Jan,
ich bin in Bonn und arbeite bei der EDiflow GmbH (Dr. Dietrich Meinhardt), ihn kennst Du bestimmt. Er kennt Dich schon.

Hier ist mein Code Beispiel: siehe Anhang
soap_test.prg
(4.03 KiB) 327-mal heruntergeladen
Ich bin mir aber nicht sicher ob folgende Zeilen noch mit Soap-Request geschickt werden müssen:
POST https://wsbexpress.dhl.com/gbl/expressRateBook HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "euExpressRateBook_providerServices_ShipmentHandlingServices_Binder_getRateRequest"
Content-Length: 6015
Host: wsbexpress.dhl.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<?xml version="1.0" encoding="UTF-8"?

Unterstützt httpclient() "https" überhaupt oder nur "http".

Vielen Dank für die Hilfe im Voraus.
asim
Rookie
Rookie
Beiträge: 7
Registriert: Di, 05. Nov 2019 12:23

Re: httpClient / SOAP / XML

Beitrag von asim »

Tom hat geschrieben: Di, 05. Nov 2019 15:01 Hier ist die DHL-Schnittstelle erklärt, unter Einsatz von SoapUI: https://shop.minhorst.com/know-how/date ... el-von-dhl Wenn man das in SoapUI lädt, sieht man alle Requests, kann die Variablen bestücken und die Ergebnisse kontrollieren. Und wenn man damit fertig ist, baut man's in die eigene Software ein.
Die WSDL-Datei gibt's hier:
https://cig.dhl.de/cig-wsdls/com/dpdhl/ ... i-2.2.wsdl
Hallo Tom,
dankeschön für die Info. Das hilft mir weiter.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Jan »

Hallo asim,

HttpClient() kann auch HTTPS. Es gibt da keinen eigene Schalter für, der erkennt das aus der Tatsache, das da ein "HTTPS" steht und leitet die entsprechenden Schritte automatisch ein.

Der ganze Block ab POST bis die komplette Zeile User-Agent gehört nicht in die XML rein. Das gehört alles in den HTTP-Request.

Die Rückmeldung von DHL moniert ja irgend einen Fehler in den Details. Ohne sich da weiter drüber auszulassen. Allerdings sagen :getStatusCode() und :getStatusText() Dir ein 500 "Methode ist für dieses Objekt unbekannt". Ich tippe also darauf das Du in der XML was falsch formatiert oder angegeben hast. Mir fehlt auf den ersten Blick da der Hiwneis auf euExpressRateBook_providerServices_ShipmentHandlingServices_Binder_getRateRequest, den Du ja im SOAPAction des Headers unterbringst. Aber ob es das (alleine) ist, dafür kenne ich jetzt DHL zu wenig.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
asim
Rookie
Rookie
Beiträge: 7
Registriert: Di, 05. Nov 2019 12:23

Re: httpClient / SOAP / XML

Beitrag von asim »

Hallo Jan,
Der ganze Block ab POST bis zur kompletten Zeile User-Agent habe ich in den HTTP-Request wie folgt eingerichtet:

oHC := HttpClient():new("https://wsbexpress.dhl.com:443/sndpt/expressRateBook")
oHC:httpRequest:setHeader("POST", "https://wsbexpress.dhl.com/gbl/expressRateBook HTTP/1.1")
oHC:httpRequest:setAcceptEncoding( {"gzip;q=1.0", "deflate;q=0.8", "*;q=0"} )
oHC:httpRequest:setContentType('text/xml;charset=UTF-8')
oHC:httpRequest:setHeader("SOAPAction", "urn:euExpressRateBook_providerServices_ShipmentHandlingServices_Binder_getRateRequest")
oHC:setProxy("wsbexpress.dhl.com")
oHC:httpClient:setUserAgent("Apache-HttpClient/4.1.1 (java 1.5)")
oHC:setAcceptType("text/xml")
oHC:setAcceptCharSet("utf-8")
oHC:httpRequest:setMethod("POST")
oHC:httpRequest:setContent(soapRequest)
cResult := oHC:send()
?cResult
MemoWrit("ResultFile.txt",cResult)

Gott sei dank funktioniert es.
Im Anhang findest Du die Response-Datei (Etikett-Datei).
ResultFile.txt
(8.24 KiB) 268-mal heruntergeladen

Weißt Du vielleicht wie ich die Datei umwandeln und ein Etikett drucken kann.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Tom »

Du holst Dir das Attribut "GraphicImage", das enthält die Base64-codierte Datei. Die decodierst Du und speicherst das als PDF, feddisch.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: httpClient / SOAP / XML

Beitrag von Tom »

Und das ist die PDF-Datei, die dabei entsteht:
Dateianhänge
dhl.pdf
(5.38 KiB) 305-mal heruntergeladen
Herzlich,
Tom
asim
Rookie
Rookie
Beiträge: 7
Registriert: Di, 05. Nov 2019 12:23

Re: httpClient / SOAP / XML

Beitrag von asim »

Tom hat geschrieben: Do, 07. Nov 2019 12:24 Du holst Dir das Attribut "GraphicImage", das enthält die Base64-codierte Datei. Die decodierst Du und speicherst das als PDF, feddisch.
Hallo Tom,
dankeschön, es hat mir wirklich geholfen. Es wurde alles geklappt.
Danke nochmal an allen.

lg
asim
Antworten