AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DHL-Webservice nutzen

Offene Frage von "arnof"
Ein Thema von CarstenH · begonnen am 2. Nov 2015 · letzter Beitrag vom 12. Nov 2015
Antwort Antwort
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

AW: DHL-Webservice nutzen

  Alt 11. Nov 2015, 20:49
Hallo,

die älteren Delphis hatten Probleme mit Soap Arrays, da war was. Es gab da auch mehr oder weniger seperate soappatches dazu, die nicht direkt veröffentlicht/verteilt wurden. Wie schon von anderen gesagt: vergiß es mit einem alten Delphi.

SoapUI is auch noch ein gutes tool, um die Webservices zu testen und zu vergleichen, was Delphi macht.

Den intraship-Webservice für die Sendungserstellung nutze ich nicht, nur andere zur Sendungsverfolgung und Laufzeitermittlung. Aber bei denen gibt es auch noch eine weitere Variante, XML selbst aufzubauen und zu versenden. mit dem XML-Datenbindungswizard bist du da auch recht schnell am Ziel um die notwendigen XMLs aufzubauen und auszulesen. Hier wie ich aber nicht, aber welcher Delphiversion dieser dabei ist.

Gruß Frank

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: DHL-Webservice nutzen

  Alt 11. Nov 2015, 21:32
AFAIK ist der Datenbindungswizard ab der Enterprise-Version dabei.

Probleme mit SOAP gibt es allerdings auch mit der aktuellsten Delphi Version.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
CarstenH

Registriert seit: 18. Feb 2006
18 Beiträge
 
Delphi 7 Professional
 
#3

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 00:53
REST bietet DHL wohl auch an, aber offenbar nur für die Sendungsverfolgung.
Hab keine Infos dazu bei denen gefunden, außer dass sie es anbieten.

Carsten
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#4

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 07:23
Hallo Carsten,

vor dreieinhalb Jahren stand ich vor einem sehr ähnlichen Problem. Der Import der benötigten WSDL-Datei generierte eine 13.000-Zeilen-Unit und sämtliche Bemühungen, die Geschichte ans Laufen zu bringen scheiterten kläglich. Bei mir kam noch erschwerend hinzu, dass ich anfangs keinen Zugriff auf den Server hatte (Zugriff hatten nur meine Kunden) und dass auch noch Client-Zertifikate eingesetzt werden. Dass ich von dem Thema SOAP überhaupt keine Ahnung hatte, machte die Sache auch nicht unbedingt einfacher.

Da mir damals die Zeit im Nacken saß, hatte ich Glück, dass mir ein Bekannter ein kleines C-Progrämmchen gebaut hat (nur 25 KB groß), welches das benötigte Zertifikat ausliest, die Verbindung zum Server herstellt und per HTTP-Request die Abfragen erledigt. Ich kann das Programm mit entsprechenden Parametern aufrufen, und dann eine von diesem Programm erstellte Textdatei, die entweder eine Fehlermeldung oder das Resultat der Abfrage (XML) enthält auslesen. Das Auswerten der XML-Daten übernimmt dann ein selbstgebauter Parser. Ich bin froh, den WSDL-Tüddel nicht verwenden zu müssen!

Lange Rede, kurzer Sinn: Irgendwann - als ich Zeit dafür hatte - habe ich das C-Programm dann in Delphi umgesetzt. Funktioniert (im Sinne von getestet) mit Windows XP und Windows 7. Falls Du Dich durchringen willst ebenso vorzugehen, kann ich den Code gerne hier einstellen; muss ich nur ein bisschen vorzeigbar aufhübschen und evtl. etwas kommentieren.

Ist der DHL-Service eigentlich für jedermann zugänglich oder muss man irgendwie registriert sein?

Gruß Michael
  Mit Zitat antworten Zitat
CarstenH

Registriert seit: 18. Feb 2006
18 Beiträge
 
Delphi 7 Professional
 
#5

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 07:39
Da sag ich natürlich nicht nein. Ich geh jetzt evtl. auch erstmal den Weg über C.
Bei DHL muss man sich kostenlos registrieren.
https://entwickler.dhl.de

Carsten
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#6

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 08:20
Da sag ich natürlich nicht nein. Ich geh jetzt evtl. auch erstmal den Weg über C.
...
Gut. Ich werde versuchen, den Code im Laufe des Tages hier einzustellen. Im Augenblick zerrt Javascript an meinen Nerven ..., aber dann kümmer ich mich um "SendRequest".

Bis später.
  Mit Zitat antworten Zitat
vagtler

Registriert seit: 9. Jul 2010
Ort: Köln
667 Beiträge
 
Delphi 2010 Professional
 
#7

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 08:23
REST bietet DHL wohl auch an, aber offenbar nur für die Sendungsverfolgung. [...]
Stimmt. Das hatte ich falsch in Erinnerung.

[...] Ich geh jetzt evtl. auch erstmal den Weg über C. [...]
Nicht wirklich, oder? Da stelle ich mir https://www.youtube.com/watch?v=hXqLWqCqDHc angenehmer vor.

Ich würde dann doch eher zu C# raten oder mir z.B. mit Strongloop einen SOAP-REST-Proxy bauen.
  Mit Zitat antworten Zitat
CarstenH

Registriert seit: 18. Feb 2006
18 Beiträge
 
Delphi 7 Professional
 
#8

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 08:40
C#, sorry

Carsten
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#9

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 11:32
So, hier nun der angekündigte HTTP-Request-Code:
Delphi-Quellcode:
unit SendHTTPRequest;

interface

uses
  Windows, SysUtils,
  M_WinHttp, // siehe: http://www.tek-tips.com/faqs.cfm?fid=7493
  JwaWinCrypt; // siehe: http://jedi-apilib.sourceforge.net

implementation

function SendRequest(Host : String;
                     Service : String;
                     Proxy : String;
                     SoapAction : WideString;
                     RequestData : UTF8String;
                     CertName : String;
                     FName : String;
                     var ErrCode : Integer;
                     var ErrText : String):Boolean;
 var
     hConnect, hRequest, hSession : HInternet;
     UserAgent : WideString;
     dwContext, BytesRead, BytesWritten, HeaderLen, OptionLen : Cardinal;
     szBuffer : array[1..32768] of byte;
     DownloadSize : Int64;
     FHandle, I : Integer;
     FSizeRead : DWord;
     hStore : HCERTSTORE;
     pCert : PCertContext;
     S : String;

  procedure CleanUp;
  begin
    if hSession <> nil then WinHttpCloseHandle(hSession);
    if hConnect <> nil then WinHttpCloseHandle(hConnect);
    if hRequest <> nil then WinHttpCloseHandle(hRequest);
    CloseHandle(FHandle);
  end;

begin
  Result:=False; ErrCode:=0; ErrText:='';
  hConnect := nil;
  hRequest := nil;
  UserAgent:='Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; Trident/5.0)';

  FHandle:=FileCreate(FName);
  if (FHandle < 0) then
   begin
     ErrCode:=GetLastError;
     ErrText:='Can not create file';
     Exit;
   end;

  hSession := WinHttpOpen(PWideChar(UserAgent),
                          WINHTTP_ACCESS_TYPE_NAMED_PROXY,
                          PWideChar(WideString(Proxy)),
                          WINHTTP_NO_PROXY_BYPASS,
                          0);
  if (hSession = NIL) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     Exit;
   end;

  hConnect:=WinHttpConnect(hSession,
                           PWideChar(WideString(Host)),
                           INTERNET_DEFAULT_HTTPS_PORT,
                           0);
  if (hConnect = NIL) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  hRequest:=WinHttpOpenRequest(hConnect,
                               PWideChar(WideString('POST')),
                               PWideChar(WideString(Service)),
                               nil,
                               WINHTTP_NO_REFERER,
                               WINHTTP_DEFAULT_ACCEPT_TYPES,
                               WINHTTP_FLAG_SECURE or WINHTTP_FLAG_ESCAPE_DISABLE{0});
  if (hRequest = NIL) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // Zertifikatspeicher (MY) öffnen...
  hStore:=CertOpenStore(CERT_STORE_PROV_SYSTEM,
                        0,
                    0,
                    CERT_SYSTEM_STORE_CURRENT_USER,
                    WideChar(WideString('MY')));
  if (hStore = NIL) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // Zertifikat lesen...
  pCert:=CertFindCertificateInStore(hStore,
                                    X509_ASN_ENCODING,
                                    0,
                                    CERT_FIND_SUBJECT_STR,
                                    PWideChar(WideString(CertName)),
                                    NIL);
  if (pCert = NIL) then
   begin
     ErrCode:=99;
     ErrText:='Error CertFindCertificateInStore';
     CleanUp; Exit;
   end;

  // und dem Request als Option hinzufügen...
  if not WinHttpSetOption(hRequest,
                      WINHTTP_OPTION_CLIENT_CERT_CONTEXT,
                      pCert,
                          SizeOf(CERT_CONTEXT)) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // Zertifikatspeicher schließen...
  CertFreeCertificateContext(pCert);
  CertCloseStore(hStore, 0);

  // Requestdaten vorbereiten...
  dwContext:=0;
  FillChar(szBuffer, SizeOf(szBuffer), 0);
  I:=1; OptionLen:=Length(RequestData);
  repeat
    szBuffer[I]:=Ord(RequestData[I]);
    Inc(I);
  until (I > OptionLen);
  S:='';
  for I:=1 to Length(RequestData) do S:=S+Char(szBuffer[I]);

  HeaderLen:=Length(SoapAction) * 2;
  OptionLen:=Length(RequestData);

  // und abschicken...
  if not WinHttpSendRequest(hRequest,
                            WINHTTP_NO_ADDITIONAL_HEADERS,
                            0,
                            @szBuffer,
                            OptionLen,
                            OptionLen,
                            dwContext) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // Antwort holen...
  if not WinHttpReceiveResponse(hRequest, nil) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // und lesen...
  FillChar(szBuffer, SizeOf(szBuffer), 0);
  if not WinHttpReadData(hRequest, @szbuffer, sizeof(szbuffer), BytesRead) then
   begin
     ErrCode:=GetLastError;
     ErrText:=WinHttpSysErrorMessage(ErrCode);
     CleanUp; Exit;
   end;

  // und in Ausgabedatei schreiben...
  while (BytesRead > 0) do
   begin
     WriteFile(FHandle, szBuffer, BytesRead, BytesWritten, nil);
     FillChar(szBuffer, SizeOf(szBuffer), 0);
     if not WinHttpReadData(hRequest, @szbuffer, sizeof(szbuffer), BytesRead) then
      begin
        ErrCode:=GetLastError;
        ErrText:=WinHttpSysErrorMessage(ErrCode);
        CleanUp; Exit;
      end;
   end;

  CleanUp;
  Result:=True;
end; { SendRequest }


if SendRequest('dhl.serviceportal.net', // Host,
               'service/soap/dhl/', // Service
               '12.174.13.120:8080', // Proxy,
               'CreateShipmentResponse', // SoapAction,
               '...', // RequestData
               '...', // Fingerprint des Zertifikats
               'c:\soap\response.xml', // Antwortdatei
               ErrCode, // Fehlercode
               ErrText) // Fehlertext
             then
begin
...
end;
Bei mir läuft der Code unter Delphi 2010. Wenn Du keine lokalen Zertifikate benötigst, kannst Du die Routine entsprechend anpassen (raus damit). Das Gleiche gilt für die Angabe des Proxys. Auf den Seiten von Microsoft kann man die möglichen Parameter der Funktionen nachlesen.

Viel Erfolg!

Gruß Michael
  Mit Zitat antworten Zitat
CarstenH

Registriert seit: 18. Feb 2006
18 Beiträge
 
Delphi 7 Professional
 
#10

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 12:16
Ganz herzlichen Dank!

Ich hab eben entdeckt, dass die Post auch so einen Webservice betreibt. Der würde für mich sogar noch besser passen, da ich nur Briefe frankieren will und mich nur auf DHL gestützt hatte, weil die Post erst ab 20.000 Vorgänge o.ä. pro Jahr einen entsprechenden Profi-Service anbietet. Offenbar gibt es das aber doch auch "in klein", wie hier beschrieben:
http://www.vinett.de/post/internetma...er-webservice/
WSDL-Import hat erstmal geklappt. Weitere Doku dazu hab ich noch nicht gefunden. Kennt sich zufällig jemand damit aus?

Carsten
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz