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
CarstenH

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

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
 
#2

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
 
#3

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
 
#4

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
 
#5

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
 
#6

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
 
#7

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
 
#8

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
CarstenH

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

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 15:50
Ein Nachtrag dazu: Hab inzwischen rausbekommen, dass die Post das Thema wohl extrem schlecht unterstützt. Allein ein login zur Nutzung dauert zig Wochen. Support gibt es selbst für Großabnehmer praktisch gar nicht.
Es gibt aber wackere Dienstleister, die die Hürde überwunden haben, neben dem oben verlinkten auch billbee.de, die einen einfachen zu handhabenden Webservice mit Support für ganz vernünftige Konditionen anbieten.

Carsten
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.261 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 20:07
Ein Nachtrag dazu: Hab inzwischen rausbekommen, dass die Post das Thema wohl extrem schlecht unterstützt. Allein ein login zur Nutzung dauert zig Wochen. Support gibt es selbst für Großabnehmer praktisch gar nicht.
Es gibt aber wackere Dienstleister, die die Hürde überwunden haben, neben dem oben verlinkten auch billbee.de, die einen einfachen zu handhabenden Webservice mit Support für ganz vernünftige Konditionen anbieten.

Carsten
wir haben auch diese Hürden überwunden, Dienstleistung kann man auch bei uns einkaufen:

- Intraship

und die nächste Version mit den tollen Namen: Versenden
  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 06:08 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