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
Seite 3 von 3     123   
CarstenH

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

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

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

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

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.250 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#25

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
Keldorn

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

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 21:03
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.250 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#27

AW: DHL-Webservice nutzen

  Alt 12. Nov 2015, 21:38
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   

 

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 01:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz