Delphi-PRAXiS

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 2. Nov 2015 13:35

DHL-Webservice nutzen
 
Ich versuche bislang vergeblich, den DHL-Webservice an den Start zu bekommen. Folgender Effekt: Wenn ich die Datei
https://cig.dhl.de/cig-wsdls/com/dpd...d-api-1.0.wsdl
über der WSDL-Import importiere, kennt Delphi danach diverse Typen nicht, z.B. CreateShipmentTDRequest.

Mir ist jetzt nicht klar, wie ich mich dem Problem nähern kann. brauch ich evtl. ein neueres Delphi (7 Prof. ist am Start) oder sind es Einstellungsfragen oder bekomm ich die Typdeklarationen woanders her?

Ich hab auch mal dieses Beispiel durchgespielt:
http://www.onlinedelphitraining.com/...ebservices.htm
Es kompiliert, liefert aber bei der Abfrage des Webservice auch Fehler, auch wenn ich nur die mitgelieferten Originalquellcodes kompiliere.

Carsten


Delphi-Quellcode:
// ************************************************************************ //
// Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus
// unten beschriebener WSDL-Datei stammen:
// WSDL    : https://cig.dhl.de/cig-wsdls/com/dpdhl/wsdl/geschaeftskundenversand-api/1.0/geschaeftskundenversand-api-1.0.wsdl
// Codierung : UTF-8
// Codegen : [wfDebug,wfServer,wfUseSerializerClassForAttrs,wfGenTrueGUIDs]
// Version : 1.0
// (01.11.2015 23:14:55 - 1.33.2.5)
// ************************************************************************ //

unit geschaeftskundenversand_api_dhl;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei
  // nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen,
  // aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie
  // sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen
  // für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..
  // ************************************************************************ //
  // !:CreateShipmentTDRequest - "http://de.ws.intraship"
  // !:CreateShipmentResponse - "http://de.ws.intraship"
  // !:Authentification - "http://dhl.de/webservice/cisbase"
  // !:CreateShipmentDDRequest - "http://de.ws.intraship"
  // !:DeleteShipmentTDRequest - "http://de.ws.intraship"
  // !:DeleteShipmentResponse - "http://de.ws.intraship"
  // !:DeleteShipmentDDRequest - "http://de.ws.intraship"
  // !:DoManifestTDRequest - "http://de.ws.intraship"
  // !:DoManifestResponse - "http://de.ws.intraship"
  // !:DoManifestDDRequest - "http://de.ws.intraship"
  // !:GetLabelTDRequest - "http://de.ws.intraship"
  // !:GetLabelResponse - "http://de.ws.intraship"
  // !:GetLabelDDRequest - "http://de.ws.intraship"
  // !:BookPickupRequest - "http://de.ws.intraship"
  // !:BookPickupResponse - "http://de.ws.intraship"
  // !:CancelPickupRequest - "http://de.ws.intraship"
  // !:CancelPickupResponse - "http://de.ws.intraship"
  // !:Version        - "http://dhl.de/webservice/cisbase"
  // !:GetVersionResponse - "http://de.ws.intraship"
  // !:GetExportDocTDRequest - "http://de.ws.intraship"
  // !:GetExportDocResponse - "http://de.ws.intraship"
  // !:GetExportDocDDRequest - "http://de.ws.intraship"
  // !:GetManifestDDRequest - "http://de.ws.intraship"
  // !:GetManifestDDResponse - "http://de.ws.intraship"
  // !:UpdateShipmentDDRequest - "http://de.ws.intraship"
  // !:UpdateShipmentResponse - "http://de.ws.intraship"


  // ************************************************************************ //
  // Namespace : http://de.ws.intrashipservice
  // soapAction: urn:%operationName%
  // Transport : http://schemas.xmlsoap.org/soap/http
  // Stil    : document
  // Bindung  : ShipmentServiceSOAP11Binding
  // Service  : ISService_1_0_de
  // Port     : ShipmentServiceSOAP11port0
  // URL      : https://cig.dhl.de/services/production/soap
  // ************************************************************************ //
  ISWSServicePortType = interface(IInvokable)
  ['{35DA55F0-0197-EA24-95BA-6A40B3CBB3F7}']
    function createShipmentTD(const part1: CreateShipmentTDRequest): CreateShipmentResponse; stdcall;
    function createShipmentDD(const part1: CreateShipmentDDRequest): CreateShipmentResponse; stdcall;
    function deleteShipmentTD(const part1: DeleteShipmentTDRequest): DeleteShipmentResponse; stdcall;
    function deleteShipmentDD(const part1: DeleteShipmentDDRequest): DeleteShipmentResponse; stdcall;
    function doManifestTD(const part1: DoManifestTDRequest): DoManifestResponse; stdcall;
    function doManifestDD(const part1: DoManifestDDRequest): DoManifestResponse; stdcall;
    function getLabelTD(const part1: GetLabelTDRequest): GetLabelResponse; stdcall;
    function getLabelDD(const part1: GetLabelDDRequest): GetLabelResponse; stdcall;
    function bookPickup(const part1: BookPickupRequest): BookPickupResponse; stdcall;
    function cancelPickup(const part1: CancelPickupRequest): CancelPickupResponse; stdcall;
    function getVersion(const part1: Version): GetVersionResponse; stdcall;
    function getExportDocTD(const part1: GetExportDocTDRequest): GetExportDocResponse; stdcall;
    function getExportDocDD(const part1: GetExportDocDDRequest): GetExportDocResponse; stdcall;
    function getManifestDD(const part1: GetManifestDDRequest): GetManifestDDResponse; stdcall;
    function updateShipmentDD(const part1: UpdateShipmentDDRequest): UpdateShipmentResponse; stdcall;
  end;



implementation

type

  ISWSServicePortTypeImpl = class(TInvokableClass, ISWSServicePortType)
  public
    { ISWSServicePortType }
    function createShipmentTD(const part1: CreateShipmentTDRequest): CreateShipmentResponse; stdcall;
    function createShipmentDD(const part1: CreateShipmentDDRequest): CreateShipmentResponse; stdcall;
    function deleteShipmentTD(const part1: DeleteShipmentTDRequest): DeleteShipmentResponse; stdcall;
    function deleteShipmentDD(const part1: DeleteShipmentDDRequest): DeleteShipmentResponse; stdcall;
    function doManifestTD(const part1: DoManifestTDRequest): DoManifestResponse; stdcall;
    function doManifestDD(const part1: DoManifestDDRequest): DoManifestResponse; stdcall;
    function getLabelTD(const part1: GetLabelTDRequest): GetLabelResponse; stdcall;
    function getLabelDD(const part1: GetLabelDDRequest): GetLabelResponse; stdcall;
    function bookPickup(const part1: BookPickupRequest): BookPickupResponse; stdcall;
    function cancelPickup(const part1: CancelPickupRequest): CancelPickupResponse; stdcall;
    function getVersion(const part1: Version): GetVersionResponse; stdcall;
    function getExportDocTD(const part1: GetExportDocTDRequest): GetExportDocResponse; stdcall;
    function getExportDocDD(const part1: GetExportDocDDRequest): GetExportDocResponse; stdcall;
    function getManifestDD(const part1: GetManifestDDRequest): GetManifestDDResponse; stdcall;
    function updateShipmentDD(const part1: UpdateShipmentDDRequest): UpdateShipmentResponse; stdcall;
  end;

function ISWSServicePortTypeImpl.createShipmentTD(const part1: CreateShipmentTDRequest): CreateShipmentResponse;
begin
  { TODO - Implement method createShipmentTD }
end;

function ISWSServicePortTypeImpl.createShipmentDD(const part1: CreateShipmentDDRequest): CreateShipmentResponse;
begin
  { TODO - Implement method createShipmentDD }
end;

function ISWSServicePortTypeImpl.deleteShipmentTD(const part1: DeleteShipmentTDRequest): DeleteShipmentResponse;
begin
  { TODO - Implement method deleteShipmentTD }
end;

function ISWSServicePortTypeImpl.deleteShipmentDD(const part1: DeleteShipmentDDRequest): DeleteShipmentResponse;
begin
  { TODO - Implement method deleteShipmentDD }
end;

function ISWSServicePortTypeImpl.doManifestTD(const part1: DoManifestTDRequest): DoManifestResponse;
begin
  { TODO - Implement method doManifestTD }
end;

function ISWSServicePortTypeImpl.doManifestDD(const part1: DoManifestDDRequest): DoManifestResponse;
begin
  { TODO - Implement method doManifestDD }
end;

function ISWSServicePortTypeImpl.getLabelTD(const part1: GetLabelTDRequest): GetLabelResponse;
begin
  { TODO - Implement method getLabelTD }
end;

function ISWSServicePortTypeImpl.getLabelDD(const part1: GetLabelDDRequest): GetLabelResponse;
begin
  { TODO - Implement method getLabelDD }
end;

function ISWSServicePortTypeImpl.bookPickup(const part1: BookPickupRequest): BookPickupResponse;
begin
  { TODO - Implement method bookPickup }
end;

function ISWSServicePortTypeImpl.cancelPickup(const part1: CancelPickupRequest): CancelPickupResponse;
begin
  { TODO - Implement method cancelPickup }
end;

function ISWSServicePortTypeImpl.getVersion(const part1: Version): GetVersionResponse;
begin
  { TODO - Implement method getVersion }
end;

function ISWSServicePortTypeImpl.getExportDocTD(const part1: GetExportDocTDRequest): GetExportDocResponse;
begin
  { TODO - Implement method getExportDocTD }
end;

function ISWSServicePortTypeImpl.getExportDocDD(const part1: GetExportDocDDRequest): GetExportDocResponse;
begin
  { TODO - Implement method getExportDocDD }
end;

function ISWSServicePortTypeImpl.getManifestDD(const part1: GetManifestDDRequest): GetManifestDDResponse;
begin
  { TODO - Implement method getManifestDD }
end;

function ISWSServicePortTypeImpl.updateShipmentDD(const part1: UpdateShipmentDDRequest): UpdateShipmentResponse;
begin
  { TODO - Implement method updateShipmentDD }
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(ISWSServicePortType), 'http://de.ws.intrashipservice', 'UTF-8');
  InvRegistry.RegisterInvokableClass(ISWSServicePortTypeImpl);
  InvRegistry.RegisterHeaderClass(TypeInfo(ISWSServicePortType), Authentification, hmtAll, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'createShipmentTD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'createShipmentDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'deleteShipmentTD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'deleteShipmentDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'doManifestTD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'doManifestDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'getLabelTD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'getLabelDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'bookPickup', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'cancelPickup', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'getExportDocTD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'getExportDocDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'getManifestDD', hmtRequest, False);
  InvRegistry.RegisterHeaderMethod(TypeInfo(ISWSServicePortType), Authentification, 'updateShipmentDD', hmtRequest, False);

end.

Bernhard Geyer 2. Nov 2015 21:32

AW: DHL-Webservice nutzen
 
D7?Kannst du auch gegen eine neue Delphi-version prüfen? Altere Versionn winf nicht dafür bekannt problemlos zu funkionieren

CarstenH 2. Nov 2015 21:41

AW: DHL-Webservice nutzen
 
2005 hat jemand für mich getestet, gleicher Befund.

carsten

Bernhard Geyer 2. Nov 2015 21:54

AW: DHL-Webservice nutzen
 
2005 kann man aber nicht mehr als neue Version bezeichnen. Afaike gab es erst später eine neuimplementierung der webservice-schnittstelle

CarstenH 2. Nov 2015 22:33

AW: DHL-Webservice nutzen
 
Hat die vielleicht einer der Mitleser und könnte einmal

https://cig.dhl.de/cig-wsdls/com/dpd...d-api-1.0.wsdl

durchlaufen lassen?

Carsten

Bebe 3. Nov 2015 05:04

AW: DHL-Webservice nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

habe es mit der neusten Delphi Version importiert.

Gruß
Matze

CarstenH 3. Nov 2015 08:34

AW: DHL-Webservice nutzen
 
Das kompiliert nach ein paar formalen Anpassungen.
Nur mit SCOPEDENUMS kann Delphi 7 nichts anfangen. Hab die doppelten erstmal umbenannt, mir aber noch nicht weiter angeschaut, welche Konsequenzen das hat.

Besten Dank erstmal!

Carsten

CarstenH 11. Nov 2015 16:52

AW: DHL-Webservice nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich beiße mir an dem Thema weiter die Zähne aus. Habe jetzt die Testversion des neusten Delphi installiert. Dann hat mir jemand aus der DHL-C#-Demo ein Miniprogramm gebaut, das auch funktioniert. Ich hab Fiddler installiert, um zu schauen, was dort genau zum Server geht (im Bild unten die linke Seite). Hab dann versucht, das in Delphi umzusetzen, es kommt aber nur der rechts zu sehende Teil an.

Wie kann man sich dem problem nähern?

Carsten

Sir Rufo 11. Nov 2015 17:04

AW: DHL-Webservice nutzen
 
Es gibt da Situationen, wo man einfach von Delphi über eine C#-DLL auf den SOAP-Service zugreift.

Da stellen sich erheblich schneller funktionierende Resultate ein. :stupid:

CarstenH 11. Nov 2015 17:22

AW: DHL-Webservice nutzen
 
Das hab ich auch schon überlegt...kann nur kein C# und hab eigentlich keine Lust mich extra dafür mit C# zu bewaffnen.

Carsten

vagtler 11. Nov 2015 17:55

AW: DHL-Webservice nutzen
 
Meines Wissens nach werden die Endpunkte doch auch als REST-Services bereitgestellt. Spricht irgendwas gegen die Nutzung dieser?

CarstenH 11. Nov 2015 18:53

AW: DHL-Webservice nutzen
 
Kannst Du bitte mit ein, zwei Sätzen sagen, wie man da so ungefähr vorgeht? (Hab leider davon noch keine Ahnung - also dioe wsdl-datei muss ja irgendwie ins Spiel kommen).

Carsten

Sir Rufo 11. Nov 2015 18:56

AW: DHL-Webservice nutzen
 
Zitat:

Zitat von CarstenH (Beitrag 1321198)
Kannst Du bitte mit ein, zwei Sätzen sagen, wie man da so ungefähr vorgeht? (Hab leider davon noch keine Ahnung - also dioe wsdl-datei muss ja irgendwie ins Spiel kommen).

Carsten

Es gibt SOAP (das mit der WSDL-Datei) und/oder REST.

Nimmst du REST brauchst du die WSDL-Datei nicht. Dafür gibt es dann eine entsprechende Dokumentation und du baust dir deine Schnittstelle selber zusammen.

Keldorn 11. Nov 2015 20:49

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

Sir Rufo 11. Nov 2015 21:32

AW: DHL-Webservice nutzen
 
AFAIK ist der Datenbindungswizard ab der Enterprise-Version dabei.

Probleme mit SOAP gibt es allerdings auch mit der aktuellsten Delphi Version.

CarstenH 12. Nov 2015 00:53

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

EmWieMichael 12. Nov 2015 07:23

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

CarstenH 12. Nov 2015 07:39

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

EmWieMichael 12. Nov 2015 08:20

AW: DHL-Webservice nutzen
 
Zitat:

Zitat von CarstenH (Beitrag 1321239)
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 :evil:..., aber dann kümmer ich mich um "SendRequest".

Bis später.

vagtler 12. Nov 2015 08:23

AW: DHL-Webservice nutzen
 
Zitat:

Zitat von CarstenH (Beitrag 1321215)
REST bietet DHL wohl auch an, aber offenbar nur für die Sendungsverfolgung. [...]

Stimmt. Das hatte ich falsch in Erinnerung.

Zitat:

Zitat von CarstenH (Beitrag 1321239)
[...] 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. :mrgreen:

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

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 16:17 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