Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   DHL-Webservice nutzen (https://www.delphipraxis.net/187157-dhl-webservice-nutzen.html)

CarstenH 12. Nov 2015 08:40

AW: DHL-Webservice nutzen
 
C#, sorry

Carsten

EmWieMichael 12. Nov 2015 11:32

AW: DHL-Webservice nutzen
 
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

CarstenH 12. Nov 2015 12:16

AW: DHL-Webservice nutzen
 
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

CarstenH 12. Nov 2015 15:50

AW: DHL-Webservice nutzen
 
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

arnof 12. Nov 2015 20:07

AW: DHL-Webservice nutzen
 
Zitat:

Zitat von CarstenH (Beitrag 1321331)
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

Keldorn 12. Nov 2015 21:03

AW: DHL-Webservice nutzen
 
Hallo,

dachte immer Intraship is immer DHL-Express und für nat. und internationale Pakete. Dass das intraship auch die DHL-Paket Schiene unterstützt, ist erst vor kurzem umgesetzt worden.

Für mich ist das Express das ursprüngliche DHL und Paket ist für mich die ursprüngliche Post. Und das ist bei DHL noch schön getrennt. Das intraship kenn ich nicht, wir haben eine andere Lösung von DHL. Denke aber nicht, dass du mit intraship klassische Briefe versendest bekommst, dafür ist das nicht gemacht.

Mit Briefe frankieren kenne ich mich nicht aus, was musst Du da machen?

Ich komme eher aus dem Express-Bereich, da kann ich nicht behaupten, keinen Support und keine ordentliche Doku zu bekommen. Du musst halt an die Techniker rankommen , den Draht versorgt Dir aber dein Verkäufer. Die haben immer Interesse, die Sendungen elektronisch übermittelt zu bekommen.

Bevor Du hier völlig ins Blaue räts, würde ich erstmal mit eurem zuständigen DHL-Verkäufer reden und absprechen was ihr wollt und was ihr braucht.

gruß Frank

arnof 12. Nov 2015 21:38

AW: DHL-Webservice nutzen
 
Intraship ist das Webportal mit dem fast alles geht, dann gibt es noch Easylog für Großkunden ...

Alles von DHL wird aktuell zusammengeführt zu "Versenden" und dadurch wird alles andere ersetzt. Das ist ein reines Onlineportal ähnlich Intraship.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.
Seite 3 von 3     123   

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