XML-Abfrage mit xmlhttp

13. August 2007 07:28

Hallo allerseits,

zur Sendungsverfolgeng unseres Logistik-Dienstleisters gibt es die Möglichkeit den Sendungsstatus per XML abzufragen. Ich benutze zur Abfrage Microsoft XMLhttp. Das senden funktioniert anscheinend, aber die Rückmeldung wird nicht übertragen bzw kann nicht ausgelesen werden. Mein Code:

Variablen:
XMLDoc Automation 'Microsoft XML, v3.0'.DOMDocument30
XMLAntwort Automation 'Microsoft XML, v3.0'.DOMDocument30
XMLHTTP Automation 'Microsoft XML, v3.0'.XMLHTTP30

Ich erzeuge das folgende XML-Dokument:

<?xml version="1.0" encoding="UTF-8" ?>
<data appname="xxxxxx" password="yyyyyy" request="d-get-piece" language-code="de" piece-code="zzzzzzzzzzzzzzz" />

in XMLDoc

und sende es mit XMLHTTP:

Server := '//https://nolb.dhl.de.....?XML='
CREATE(XMLHttp);
XMLHttp.open('POST', Server,FALSE);
XMLHttp.send(XmlDoc);
IF XMLHttp.readyState = 4 THEN BEGIN
MESSAGE(XMLHttp.getAllResponseHeaders());
XmlAntwort := XMLHttp.responseXML();
XmlAntwort.save('c:\Test\antwort.xml');
END;


in XMLAntwort.xml steht aber nix drin, die gesavte Datei ist leer
in getAllResponseHeaders steht u.a. das drin :

Content-Length: 971
Content-Type: text/html; cahrset=utf-8

wenn ich versuche xmlhttp.responsetext abzufragen gibt es den Navi-Fehler: 'Die Länge des Textstrings überschreitet die Länge des Zeichenpuffers'

was mache ich falsch bzw. muss ich ändern?
vielen Dank
Edgar Leifeld


P.S.: Wenn ich den XML-String im Browser direkt eingebe, dann bekomme ich einen XML-String angezeigt, der Server funktioniert also ordnungsgemäß

so gehts, aber jetzt Prob mit Auslesen des Ergebnisses

14. August 2007 11:41

habe es:

wenn ich das XML-kommando in den Servernamen beim open mit reinstelle und anschließend einen leeren Send mache, dann klappt es

also:
Server := '//https://nolb.dhl.de...'
CREATE(XMLHttp);
XMLHttp.open('POST', Server+'?XML='+XmlDoc.xml,FALSE);
XMLHttp.send('');
IF XMLHttp.readyState = 4 THEN BEGIN
MESSAGE(XMLHttp.getAllResponseHeaders());

das Ergebnis vom Server wird aber in XmlHttp.ResponseText übermittelt, dieser text ist zu lang für Navi, müsste also über einen Instrem ausgelesen werden - da fehlt es bei mir...

kann mit da vielleicht jemand helfen wie man einen Stream ausliest?

14. August 2007 14:46

Hi,

wir verwenden XML zusammen mit Streams, allerdings kann ich nicht 100%ig sagen, ob das mit auch mit xmlhttp klappt... -> hier ein Beispiel wie es aussehen koennte.

Code:
TABLE    Record mit BLOB Feld
OutStrm  OutStream
InStrm   InStream
temptext text

// In Tabelle schreiben
TABLE.RESET();
..
TABLE.CALCFIELDS("XML File");   // Type BLOB
TABLE."XML File".CREATEOUTSTREAM(OutStrm);

OutStream.WRITETEXT := XMLHTTP.responseText();
TABLE.INSERT();

// Aus Tabelle auslesen
TABLE.CREATEINSTREAM(InStrm);
WHILE NOT (InStrm.EOS()) DO BEGIN
  InStream.READTEXT(temptext);
  ...
END;



gruesse
feri

14. August 2007 15:13

danke, hab ich auch schon probiert

>> OutStream.WRITETEXT := XMLHTTP.responseText();

bringt wieder die bekannte Fehlermeldung "Die Länge des Textstrings überschreitet die Länge des Zeichenpuffers"

und
>> OutStream.WRITE := XMLHTTP.responseStream();

bringt "Sie verwenden einen ungültigen datentyp für diese Funktion"

14. August 2007 17:20

Kanns grad nicht so testen, aber wie wäre sowas:

Code:
IF XmlHttp.readyState = 4 THEN BEGIN
  CREATE(XMLDocIn);
  XMLDocIn.load(XmlHttp.responseXML);
  XMLDocIn.save('C:\Temp\ResponseXmlTest.xml');
END;

15. August 2007 03:40

elf hat geschrieben:danke, hab ich auch schon probiert

>> OutStream.WRITETEXT := XMLHTTP.responseText();

bringt wieder die bekannte Fehlermeldung "Die Länge des Textstrings überschreitet die Länge des Zeichenpuffers"

und
>> OutStream.WRITE := XMLHTTP.responseStream();

bringt "Sie verwenden einen ungültigen datentyp für diese Funktion"

und was ist, wenn du
Code:
OutStream.WRITE := XMLHTTP.responseText();

verwendest?

15. August 2007 06:28

@SilverX:

XMLDocIn.load(XmlHttp.responseXML)

geht nicht, weil in responseXml steht nix drin, die Antwort kommt als Text und steht in ResponseText

@Schumi:

nö, hatte ich auch schon, jeder Zugriff auf XmlHttp.ResponseText bingt die bekannte Fehlermeldung "Die Länge des Textstrings überschreitet...."

15. August 2007 08:21

Ach, dann liegts also an der Automation..... da ist der Puffer für ResponseText zu klein

22. August 2007 17:55

bleibt mir wohl nicht anderes übrig als eine Automation selbst zu schreiben, habe dazu Delphi wieder vorgekramt und beschäftige mich jetzt damit. Werde versuchen ein ActiveX-Element erzeugen, welches XMLHTTP kapselt und mir die Antwort als Stream liefert...
wenn ich damit weiterkomme, dann werde ich das hier posten...

Re: XML-Abfrage mit xmlhttp

11. August 2014 12:35

Hallo,

ich stehe gerade vor dem gleichen Problem, weißt du noch wie du dies damals lösen konntest?

Bzw. hat jemand eine Idee? Ich arbeite häufig mit den MS XML Objekten, aber in diesem Fall ist die Response eine Textdatei und kein XML, NAV gibt mir einen leeren Text zurück.

Re: XML-Abfrage mit xmlhttp

11. August 2014 13:10

Hi,

ich hab' mir mal die Codeunit angesehen, sieht jetzt so aus:
Code:
CREATE(XmlHttp);
XmlHttp.open('get',ServerUrl+'?xml='+XmlDoc.xml,FALSE,'','');
XmlHttp.send();
XmlDoc.load(XmlHttp.responseBody);

In XmlDoc steht dann alles drin was vom Server zurückkommt, damit arbeite ich dann weiter. Ist bei mir ja ein XML-Ergebnis. Ich erinnere mich, dass ich das zunächst auch als Text interpretieren wollte, das ging nicht wegen "..die Länge des Textes..". Zwischenzeitlich hatte ich mal ein ähnliches Problem mit reinem Text, da hatte ich dann tatsächlich eine DLL mit Delphi geschrieben, die mir den Text in eine Textdatei geschrieben hat. Das Teil habe ich aber nicht mehr im Zugriff.

Re: XML-Abfrage mit xmlhttp

11. August 2014 16:14

Danke für die schnelle Reaktion und Hinweis, fürchte nur das dies bei mir so nicht funktionieren wird, ggf. muss ich mir auch eine DLL bauen.
Die Kommunikation erfolgt bei mir über Webservice/XML Daten und läuft auch fehlerfrei.

Leider gibt es eine Funktion, welche die Daten nicht als XML zurückgibt, sondern als Text bzw. CSV Datei und eben diese Daten muss ich abgreifen und weiterverarbeiten.

Re: XML-Abfrage mit xmlhttp

12. August 2014 17:22

Die Lösung war dann doch recht einfach

Code:
iStream := XmlHttp.responseStream();