![]() |
idHTTP.post mag die klammern nicht....
Hallo lieber Gemeinde,
ich hab ein Problem mit der idHTTP Komponente. ( version 10.1.5) dank eueren Forum konnte ich mit hilfe einens IdHTTP und den IdSSLIOHandlerSocketOpenSSl einen connect zu einen SSL Server herstellen. ( die beiden passenden DLL`s zu finden war übrigens nicht einfach. ) Der Server bekommt meine XML Anfrage und liefert leider eine Fehlermeldung zurück... <?xml version="1.0" encoding="utf-8" ?> <response> <result> <msg> <code>EF00000</code> <object> <type>XML error</type> <value>Start tag expected, '<' not found at /usr/lib/perl5/XML/LibXML/SAX.pm line 64 at /usr/share/perl5/XML/Simple.pm line 295</value> </object> <text>Fehler beim Lesen des Auftrages.</text> <type>error</type> </msg> <status> <code>E00000</code> <text>Es sind Fehler bei der Verarbeitung aufgetreten.</text> <type>error</type> </status> </result> </response> gesendet wird folgendes: <?xml version="1.0" encoding="utf-8"?> <request> <auth> <user>xxxxx</user> <password>xxxxxx</password> <context>12571</context> </auth> <task> <code>0105</code> <domain> <name>xxxxxxxx.de</name> </domain> <key>payable</key> <show_contact_details>ownerc</show_contact_details> </task> </request> Der Fehlermeldung entnehme ich das ich wahrscheinlich < sende statt den > Hat einer eine Idee wie das Problem gelöst werden kann? PS. die Forensuche hab ich ausreichend genutzt, und google kann meine Anfragen bald auch nicht mehr leiden... Besten Dank für euere Mühe Hier noch der Code aus Delphi:
Delphi-Quellcode:
request := TStringlist.Create; response := TStringStream.Create(''); request.Add('<?xml version="1.0" encoding="utf-8"?>'); request.Add('<request>'); request.Add('<auth>'); request.Add('<user>xxxxx</user>'); request.Add('<password>xxxxxxx</password>'); request.Add('<context>12571</context>'); request.Add('</auth>'); request.Add('<task>'); request.Add('<code>0105</code>'); request.Add('<domain>'); request.Add('<name>silverline-server.de</name>'); request.Add('</domain>'); request.Add('<key>payable</key>'); request.Add('<show_contact_details>ownerc</show_contact_details>'); request.Add('</task>'); request.Add('</request>'); IDHttp1.ReadTimeout := 5000; // wenn ich die folgende zeile weg lasse, klappt das response auch nicht.... IdHTTP1.Request.ContentEncoding := 'utf8'; IDHttp1.Post('https://gateway.autodns.com', request, response); response.Position := 0; Memo1.Lines.LoadFromStream(response); Memo2.Lines.AddStrings(request); |
AW: idHTTP.post mag die klammern nicht....
Hallo,
du suchst anscheinend an den falschen Stellen :stupid: Die Indy-Dokumentation ist hier abrufbar: ![]() in der Doku findet sich dann das hier: ![]() genauer gesagt dieser Absatz: Zitat:
Und ein herzliches Willkommen in der DP :hi: |
AW: idHTTP.post mag die klammern nicht....
Tipp:
um mitzuverfolgen, was die Indy Komponente an den Server sendet, ist Fiddler2 ein bekanntes Tool. Es wird wie ein HTTP Proxy eingesetzt und ist kostenlos. |
AW: idHTTP.post mag die klammern nicht....
Hallo, und herzlichen Dank für die Antworten.
wenn ich die hoForceEncodeParams auf true stelle steht im request die %20 für ein leerzeichen, und die "größer als Klammer" als %3E <?xml version="1.0"%20encoding="utf-8"?%3E <request> <auth> <user>xxxxx</user> <password>xxxxx</password> <context>12571</context> </auth> <task> <code>0105</code> <domain> <name>xxxxxx.de</name> </domain> <key>payable</key> <show_contact_details>ownerc</show_contact_details> </task> </request> und damit gibts folgende "Fehler" Ausgabe: <code>EF00000</code> <object> <type>XML error</type> <value>PEReference in prologBlank needed hereparsing XML declaration: '?>' expectedStart tag expected, '<' not found at /usr/lib/perl5/XML/LibXML/SAX.pm line 64 at /usr/share/perl5/XML/Simple.pm line 295</value> </object> PS. das mit den hoForceEncodeParams hatte ich schon getestet, eigentlich hab ich an den Problem bestimmt schon mehr als 10 Std. verbracht.... eigentlich bereiten nur die < und > Probleme.... |
AW: idHTTP.post mag die klammern nicht....
Hallo peberhardt,
also du erstellst deine XML "händisch", das mag zwar mit dem geschulten Auge gut funktionieren, aber ich rate dringendst - auch wegen der Wiederverwendbarkeit davon ab. Dazu gibt es das wunderbare IXMLDocument aus der XMLIntf Datei. Aber dies ist nicht das Kernthema. Außerdem benutzt du eine veraltete Indy Version (aktuell ist >= 10.5.9). Mit einer TStringList zu arbeiten ist der richtige falsche Ansatz (name=value Prinzip). Da du quasi nur "blob" Daten sendest empfiehlt sich dazu der TStringStream. Die Daten liegen ja im UTF-8 CharSet vor, deshalb muss dieser auch damit angelegt werden:
Delphi-Quellcode:
Des weiteren wird der Datentyp von der response Variable in einen String umgewandelt.
request_data := TStringStream.Create('', CP_UTF8);
// in request.Text befindet sich die komplette XML Datei, ich rate dir aber dringendst dies anzupassen request_data.WriteString(request.Text);
Delphi-Quellcode:
Damit sollte es funktionieren und im
//ich bin mir mit dem ContentType hier nicht sicher, aber es geht in die Richtung
IDHttp1.Request.ContentType := 'application/atom+xml'; // Statt des ContentEncoding's wird der CharSet definiert. IDHttp1.Request.CharSet := 'UTF-8'; response := IDHttp1.Post('https://gateway.autodns.com', request_data);
Delphi-Quellcode:
ist dann der POST-response im richtigen "Format".
response: String
Grüße PS: Gerne kannst du dies alles nochmal in meinem Tutorial nachlesen: ![]() |
Gelöst idHTTP.post mag die klammern nicht....
Hallo geskill und an alle die mitgepostet haben
Deine Informationen haben das Problem gelöst. das: request_data := TStringStream.Create('CP_UTF8'); bzw. die übergabe im stream statt als stringlist denke ich hat das Problem gelöst. ich poste hier noch mal den funktionieren Code, so das anderen die eventuell mal dasselbe Problem haben auch geholfen ist.
Delphi-Quellcode:
Besten Dank, jetzt kann ich mich um die Rückgabe kümmern...
request := TStringlist.Create;
request_data := TStringStream.Create('CP_UTF8'); response := TStringStream.Create(''); request.Add('<?xml version="1.0" encoding="utf-8"?>'); request.Add('<request>'); request.Add('<auth>'); request.Add('<user>xxxxxx</user>'); request.Add('<password>xxxxxxx</password>'); request.Add('<context>12571</context>'); request.Add('</auth>'); request.Add('<task>'); request.Add('<code>0105</code>'); request.Add('<domain>'); request.Add('<name>xxxxxx.de</name>'); request.Add('</domain>'); request.Add('<key>payable</key>'); request.Add('<show_contact_details>ownerc</show_contact_details>'); request.Add('</task>'); request.Add('</request>'); request_data.WriteString(request.Text); IDHttp1.Request.ContentType := 'application/atom+xml'; IDHttp1.ReadTimeout := 5000; IDHttp1.Post('https://xxxx.xxxx.com', request_data, response); response.Position := 0; Memo1.Lines.LoadFromStream(response); Memo2.Lines.AddStrings(request); ( da muss z.b. ein einzelner Rückgabe wert in die DB geschrieben werden. ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 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