Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi XML an einen HTTPS Server übergeben und Response auswerten (https://www.delphipraxis.net/90815-xml-einen-https-server-uebergeben-und-response-auswerten.html)

smartmod 24. Apr 2007 11:20


XML an einen HTTPS Server übergeben und Response auswerten
 
Hallo ihr Lieben,

ich versuche ein Programm zu schreiben, mit dem ich meinen OsCommerce Shop besser und effektiver nutzen kann.
Ein Teil davon soll eine automatische Shipping Lösung für UPS werden.

Ich habe einen Entwicklerschlüssel und somit auch Zugriff auf die UPS Online Tools.

So, jetzt weiß ich aber nicht weiter.

Ich versuche seit 3 Tagen ein Request, wie es in der Entwicklerhilfe beschrieben ist, an den UPS Server zu senden. EIne Verbindung zum Server kriege ich wohl hin, der Server beendet sie aber nach dem Post.

Mein Code sieht aktuell folgendermaßen aus:

Delphi-Quellcode:
procedure TForm1.Button10Click(Sender: TObject);

var
  request: TStrings;
  response: TStringStream;

begin
  request := TStringlist.Create;
  response := TStringStream.Create('');

request.Add('<?xml version="1.0"?>');
request.Add('<AccessRequest xml:lang="en-US">');
request.Add('<AccessLicenseNumber>5BC0971811XXXXX</AccessLicenseNumber>');
request.Add('<UserId>smartmod</UserId>');
request.Add('<Password>XXXXXXXX</Password>');
request.Add('</AccessRequest>');
request.Add('<?xml version="1.0"?>');
request.Add('<ShipmentConfirmRequest xml:lang="en-US">');
request.Add('<Request>');
request.Add('<TransactionReference>');
request.Add('<CustomerContext>Ship Confirm / nonvalidate</CustomerContext>');
request.Add('<XpciVersion>1.0001</XpciVersion>');
request.Add('</TransactionReference>');
request.Add('<RequestAction>ShipConfirm</RequestAction>');
request.Add('<RequestOption>nonvalidate</RequestOption>');
request.Add('</Request>');
request.Add('<LabelSpecification>');
request.Add('<LabelPrintMethod>');
request.Add('<Code>GIF</Code>');
request.Add('</LabelPrintMethod>');
request.Add('<HTTPUserAgent>Mozilla/5.0</HTTPUserAgent>');
request.Add('<LabelImageFormat>');
request.Add('<Code>GIF</Code>');
request.Add('</LabelImageFormat>');
request.Add('</LabelSpecification>');
request.Add('<Shipment>');
request.Add('<Description>DescriptionofGoodsTest</Description>');
request.Add('<Shipper>');
request.Add('<Name>Smartmod</Name>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>06996860470</PhoneNumber>');
request.Add('<ShipperNumber>W2217V</ShipperNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<City>Frankfurt am Main</City>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</Shipper>');
request.Add('<ShipTo>');
request.Add('<CompanyName>Smartmod</CompanyName>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>069686440</PhoneNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<City>Frankfurt</City>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</ShipTo>');
request.Add('<ShipFrom>');
request.Add('<CompanyName>ShipFromCompanyName</CompanyName>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>06996860470</PhoneNumber>');
request.Add('<ShipperNumber>W2217V</ShipperNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<City>Frankfurt am Main</City>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</ShipFrom>');
request.Add('<PaymentInformation>');
request.Add('<Prepaid>');
request.Add('<BillShipper>');
request.Add('<AccountNumber>W2217V</AccountNumber>');
request.Add('</BillShipper>');
request.Add('</Prepaid>');
request.Add('</PaymentInformation>');
request.Add('<Service>');
request.Add('<Code>07</Code>');
request.Add('</Service>');
request.Add('<Package>');
request.Add('<PackagingType>');
request.Add('<Code>02</Code>');
request.Add('</PackagingType>');
request.Add('<Dimensions>');
request.Add('<UnitOfMeasurement>');
request.Add('<Code>CM</Code>');
request.Add('</UnitOfMeasurement>');
request.Add('<Length>60</Length>');
request.Add('<Width>7</Width>');
request.Add('<Height>5</Height>');
request.Add('</Dimensions>');
request.Add('<PackageWeight>');
request.Add('<UnitOfMeasurement>');
request.Add('<Code>KGS</Code>');
request.Add('</UnitOfMeasurement>');
request.Add('<Weight>3.0</Weight>');
request.Add('</PackageWeight>');
request.Add('</Package>');
request.Add('</Shipment>');
request.Add('</ShipmentConfirmRequest>');

Memo1.Text := IDHTTP1.Post('https://wwwcie.ups.com/ups.app/xml/ShipConfirm', request);

end;
Als Response sollte eigentlich etwas in dieser Art kommen:

Delphi-Quellcode:
  <?xml version="1.0" ?>
- <ShipmentConfirmResponse>
- <Response>
- <TransactionReference>
  <CustomerContext>ShipConfirmUS</CustomerContext>
  <XpciVersion>1.0001</XpciVersion>
  </TransactionReference>
  <ResponseStatusCode>1</ResponseStatusCode>
  <ResponseStatusDescription>Success</ResponseStatusDescription>
  </Response>
- <ShipmentCharges>
- <TransportationCharges>
  <CurrencyCode>USD</CurrencyCode>
  <MonetaryValue>31.38</MonetaryValue>
  </TransportationCharges>
- <ServiceOptionsCharges>
  <CurrencyCode>USD</CurrencyCode>
  <MonetaryValue>7.75</MonetaryValue>
  </ServiceOptionsCharges>
- <TotalCharges>
  <CurrencyCode>USD</CurrencyCode>
  <MonetaryValue>39.13</MonetaryValue>
  </TotalCharges>
  </ShipmentCharges>
- <BillingWeight>
- <UnitOfMeasurement>
  <Code>LBS</Code>
  </UnitOfMeasurement>
  <Weight>4.0</Weight>
  </BillingWeight>
  <ShipmentIdentificationNumber>1Z12345E1512345676</ShipmentIdentificationNumber>
  <ShipmentDigest>INSERT SHIPPING DIGEST HERE</ShipmentDigest>
  </ShipmentConfirmResponse>
Aber mein Memo bleibt immer leer und ich bekomme nur die Meldung "Connection closed gracefully". Das bedeutet, wie ich gelesen habe, dass UPS die Verbindung getrennt hat.

Noch eine Frage... Im weiteren Verlauf der Sendungsvorbereitung wird irgendwann von UPS zusammen mit einem Response ein Bild mit dem Shipping Label übergeben. Wie kann ich das weiterverwenden?

Bitte helft mir, ich kenn mich echt absolut nicht aus.

shmia 24. Apr 2007 17:14

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Du solltest deinen gesamten Request erst mal in einer Datei speichern.
Delphi-Quellcode:
request.SaveToFile('C:\request.xml');
Dann die XML-Datei doppelklicken und dann wird dir der IE sagen, ob die XML-Daten überhaupt wellformed sind.

smartmod 24. Apr 2007 19:16

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Die XML ist in Ordnung, ich habs ja aus dem SDK von UPS und nur ein paar Werte geändert.

Keldorn 24. Apr 2007 19:48

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Hallo

die UPS-onlinetools nutze ich nicht, wir nutzen das Worldship mit autoimport über xml, aber interessieren würde mich das mit den onlinetools auchmal.

Wenn du eine https-Verbindung nutzt: mußt du dich da nicht nochirgendwo authentifizieren? Sieht man zumindestens nicht im Quelltext.

Gruß Frank

DGL-luke 24. Apr 2007 19:52

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Hallo,

für SSL per Indy braucht man die OpenSSL Indy Handlers und die OpenSSL libs, die nicht im Indy-Paket direkt dabeisind.
Nur so als Hinweis zum Thema.

shmia 25. Apr 2007 08:53

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Zitat:

Zitat von smartmod
Die XML ist in Ordnung, ich habs ja aus dem SDK von UPS und nur ein paar Werte geändert.

So etwas sollte man immer überprüfen! Beim Abschreiben können immer Fehler auftreten, denn der Mensch ist ja keine Kopiermaschine.

smartmod 25. Apr 2007 17:51

Re: XML an einen HTTPS Server übergeben und Response auswert
 
Also,

die XML wird tatsächlich von IE nicht akzeptiert, obwohl sie so im SDK steht. Es ist so, dass der erste Part <AccessRequest> und der zweite Part <ShipmentConfirmRequest> nicht zusammen vorkommen dürfen, sonst meldet IE Nur ein Element auf höchster Stufe erlaubt. Also in zwei verschiedene XML gepackt, dann gehts.

Den Code habe ich entsprechend geändert und die Requests aufgeteilt:

Delphi-Quellcode:
procedure TForm1.Button10Click(Sender: TObject);

var
  request: TStrings;
  response: TStringStream;

begin
  request := TStringlist.Create;
  response := TStringStream.Create('');

request.Add('<?xml version="1.0"?>');
request.Add('<AccessRequest xml:lang="en-US">');
request.Add('<AccessLicenseNumber>5BC0971811XXXXX</AccessLicenseNumber>');
request.Add('<UserId>smartmod</UserId>');
request.Add('<Password>xxxxxxx</Password>');
request.Add('</AccessRequest>');

IDHttp1.Post('https://wwwcie.ups.com/ups.app/xml/ShipConfirm', request, response);

request.Clear;
response.Clear;

request.Add('<?xml version="1.0"?>');
request.Add('<ShipmentConfirmRequest xml:lang="en-US">');
request.Add('<Request>');
request.Add('<TransactionReference>');
request.Add('<CustomerContext>Ship Confirm / nonvalidate</CustomerContext>');
request.Add('<XpciVersion>1.0001</XpciVersion>');
request.Add('</TransactionReference>');
request.Add('<RequestAction>ShipConfirm</RequestAction>');
request.Add('<RequestOption>nonvalidate</RequestOption>');
request.Add('</Request>');
request.Add('<LabelSpecification>');
request.Add('<LabelPrintMethod>');
request.Add('<Code>GIF</Code>');
request.Add('</LabelPrintMethod>');
request.Add('<HTTPUserAgent>Mozilla/5.0</HTTPUserAgent>');
request.Add('<LabelImageFormat>');
request.Add('<Code>GIF</Code>');
request.Add('</LabelImageFormat>');
request.Add('</LabelSpecification>');
request.Add('<Shipment>');
request.Add('<Description>DescriptionofGoodsTest</Description>');
request.Add('<Shipper>');
request.Add('<Name>Smartmod</Name>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>06996860470</PhoneNumber>');
request.Add('<ShipperNumber>W2217V</ShipperNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<City>Frankfurt am Main</City>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</Shipper>');
request.Add('<ShipTo>');
request.Add('<CompanyName>Smartmod</CompanyName>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>069686440</PhoneNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<City>Frankfurt</City>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</ShipTo>');
request.Add('<ShipFrom>');
request.Add('<CompanyName>ShipFromCompanyName</CompanyName>');
request.Add('<AttentionName>Jan Petermann</AttentionName>');
request.Add('<PhoneNumber>06996860470</PhoneNumber>');
request.Add('<ShipperNumber>W2217V</ShipperNumber>');
request.Add('<Address>');
request.Add('<AddressLine1>Bertha-von-Suttner-Ring 8</AddressLine1>');
request.Add('<City>Frankfurt am Main</City>');
request.Add('<PostalCode>60598</PostalCode>');
request.Add('<CountryCode>DE</CountryCode>');
request.Add('</Address>');
request.Add('</ShipFrom>');
request.Add('<PaymentInformation>');
request.Add('<Prepaid>');
request.Add('<BillShipper>');
request.Add('<AccountNumber>W2217V</AccountNumber>');
request.Add('</BillShipper>');
request.Add('</Prepaid>');
request.Add('</PaymentInformation>');
request.Add('<Service>');
request.Add('<Code>07</Code>');
request.Add('</Service>');
request.Add('<Package>');
request.Add('<PackagingType>');
request.Add('<Code>02</Code>');
request.Add('</PackagingType>');
request.Add('<Dimensions>');
request.Add('<UnitOfMeasurement>');
request.Add('<Code>CM</Code>');
request.Add('</UnitOfMeasurement>');
request.Add('<Length>60</Length>');
request.Add('<Width>7</Width>');
request.Add('<Height>5</Height>');
request.Add('</Dimensions>');
request.Add('<PackageWeight>');
request.Add('<UnitOfMeasurement>');
request.Add('<Code>KGS</Code>');
request.Add('</UnitOfMeasurement>');
request.Add('<Weight>3.0</Weight>');
request.Add('</PackageWeight>');
request.Add('</Package>');
request.Add('</Shipment>');
request.Add('</ShipmentConfirmRequest>');

Memo1.Text:=IDHttp1.Post('https://wwwcie.ups.com/ups.app/xml/ShipConfirm', request);

end;

Nach wie vor kommt "Connection closed gracefully" und kein Response im Memo1.

Könnte mir vielleicht jemand, der sowas schonmal gemacht hat, einen kurzen Beispielcode schreiben, wie ich den Inhalt einer XML Datei an einen Server poste und das Ergebnis in einem Memo ausgeben lasse?

Also dass was ich hier versuche, nur einfach komplett neu und nicht von meinem laienhaften Code ausgehend?

Das wär klasse.

Danke schonmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 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