AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi idHTTP.post mag die klammern nicht....

idHTTP.post mag die klammern nicht....

Ein Thema von peberhardt · begonnen am 20. Jan 2013 · letzter Beitrag vom 21. Jan 2013
Antwort Antwort
peberhardt

Registriert seit: 14. Jun 2011
11 Beiträge
 
#1

idHTTP.post mag die klammern nicht....

  Alt 20. Jan 2013, 18:25
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);
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: idHTTP.post mag die klammern nicht....

  Alt 20. Jan 2013, 19:34
Hallo,
du suchst anscheinend an den falschen Stellen
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

AW: idHTTP.post mag die klammern nicht....

  Alt 20. Jan 2013, 19:55
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.
Michael Justin
  Mit Zitat antworten Zitat
peberhardt

Registriert seit: 14. Jun 2011
11 Beiträge
 
#4

AW: idHTTP.post mag die klammern nicht....

  Alt 20. Jan 2013, 20:49
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....

Geändert von peberhardt (21. Jan 2013 um 19:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#5

AW: idHTTP.post mag die klammern nicht....

  Alt 20. Jan 2013, 20:52
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 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.
Sebastian
  Mit Zitat antworten Zitat
peberhardt

Registriert seit: 14. Jun 2011
11 Beiträge
 
#6

Gelöst idHTTP.post mag die klammern nicht....

  Alt 21. Jan 2013, 19:25
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. )

Geändert von peberhardt (21. Jan 2013 um 19:28 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 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