![]() |
AW: DHL-Webservice nutzen
C#, sorry
Carsten |
AW: DHL-Webservice nutzen
So, hier nun der angekündigte HTTP-Request-Code:
Delphi-Quellcode:
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.
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; Viel Erfolg! Gruß Michael |
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: ![]() WSDL-Import hat erstmal geklappt. Weitere Doku dazu hab ich noch nicht gefunden. Kennt sich zufällig jemand damit aus? Carsten |
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 |
AW: DHL-Webservice nutzen
Zitat:
- Intraship und die nächste Version mit den tollen Namen: Versenden |
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 |
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. |
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