Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi idHTTP.post mag die klammern nicht.... (https://www.delphipraxis.net/172748-idhttp-post-mag-die-klammern-nicht.html)

peberhardt 20. Jan 2013 18:25

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, '&lt;' 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 &lt 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);

jfheins 20. Jan 2013 19:34

AW: idHTTP.post mag die klammern nicht....
 
Hallo,
du suchst anscheinend an den falschen Stellen :stupid:
Die Indy-Dokumentation ist hier abrufbar: http://www.indyproject.org/sockets/docs/index.en.aspx

in der Doku findet sich dann das hier: http://www.indyproject.org/docsite/h...TIdStream.html
genauer gesagt dieser Absatz:
Zitat:

Field values in ASource will be encoded when the HTTPOptions property contains the value hoForceEncodeParams.
==> Entweder die HTTPOptions passend einstellen, oder eine andere Überladung auswählen. Die mit zwei Streams bietet sich hier an.

Und ein herzliches Willkommen in der DP :hi:

mjustin 20. Jan 2013 19:55

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.

peberhardt 20. Jan 2013 20:49

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: '?&gt;' expectedStart tag expected, '&lt;' 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....

geskill 20. Jan 2013 20:52

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:
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);
Des weiteren wird der Datentyp von der response Variable in einen String umgewandelt.
Delphi-Quellcode:
//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);
Damit sollte es funktionieren und im
Delphi-Quellcode:
response: String
ist dann der POST-response im richtigen "Format".

Grüße

PS: Gerne kannst du dies alles nochmal in meinem Tutorial nachlesen: http://www.delphipraxis.net/160152-i...protokoll.html. Dort im Punkt 1 Daten senden der 2te Codeblock wird gezeigt, wie es mit Google-Blogger funktioniert - also ähnlich deinem Vorhaben, wenn man es abstrakt sieht.

peberhardt 21. Jan 2013 19:25

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:
  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);
Besten Dank, jetzt kann ich mich um die Rückgabe kümmern...
( da muss z.b. ein einzelner Rückgabe wert in die DB geschrieben werden. )


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