![]() |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Zitat:
Hatte beim tippen des Codes nicht mehr daran gedacht, dass die Übergabe eines TStrings-Objekts als Request an IdHTTP.Post Probleme machen kann. Das XML muss erst in einen Stream geschrieben werden welcher dann an Post übergeben werden kann. In einen meiner Codes habe ich das so gemacht:
Delphi-Quellcode:
Außerdem habe ich IdhTTP folgende Properties gesetzt:
var
... SendStream: TStream; begin // XML erzeugen ... SendStream := TMemoryStream.Create; // oder TStringStream + WriteString wie in Bummis Code try SendStream.Write(XML.Text[1], Length(XML.Text)); // bei Delphi 2009+: Length * 2 oder AnsiString statt String verwenden SendStream.Position := 0; // ... IdHTTP erzeugen, etc. IdHttp.Post(URL, SendStream, Response); // ... finally FreeAndNil(SendStream); end; end;
Delphi-Quellcode:
// HTTP-Einstellungen setzen
HTTP.Request.Accept := '*/*'; HTTP.Request.ContentType := 'text/xml'; HTTP.Request.Connection := 'Keep-Alive'; HTTP.HandleRedirects := True; |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ich habe es gerade versucht, leider klappt es bis jetzt nicht. Wieder die gleiche Exception:
Stelle 1949:
Delphi-Quellcode:
raise EIdConnClosedGracefully.Create(RSConnectionClosedGracefully);
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var xml: TStrings; response: TStringStream; SendStream: TStream; TextToCheck: String; begin TextToCheck := 'Teest'; // das Wort welches geprüft / korrigiert werden soll xml := TStringList.Create; response := TStringStream.Create(''); SendStream := TMemoryStream.Create; try xml.Add('<?xml version="1.0" encoding="UTF-8"?>'); xml.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); xml.Add(' <text>' + TextToCheck + '</text>'); xml.Add('</spellrequest>'); IdHTTP1.Request.Accept := '*/*'; IdHTTP1.Request.ContentType := 'text/xml'; IdHTTP1.Request.Connection := 'Keep-Alive'; IdHTTP1.HandleRedirects := True; SendStream.Write(xml.Text[1], Length(XML.Text)); SendStream.Position := 0; try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', SendStream, response); ShowMessage(response.DataString); except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; finally FreeAndNil(response); FreeAndNil(xml); FreeAndNil(SendStream); end; end; |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Zitat:
![]() Was gibt dir ShowMessage(response.DataString); aus? (du musst im Exception-Dialog auf Fortsetzen klicken, damit das Programm weiterläuft) |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ah so danke, ja es kommt tatsächlich was vernünftiges raus beim fortsetzen :-D
Für 'Teest':
Code:
Scheint also zu klappten, vielen dank nochmal.
<?xml version="1.0" encoding="UTF-8"?><spellresult error="0" clipped="0" charschecked="5" suggestedlang="en"><c o="0" l="5" s="1">Test Teestd Teeast Teeist Teeost</c></spellresult>
Wie ist das jetzt wenn ich einen ganzen Textabschnitt überprüfen will, muss ich dann jedes Wort einzeln anfragen ? Kann es da dann Probleme geben wegen übermaßigen Serveranfragen, es könnte ja als eine art Angriff gewertet werden, wenn ich ein paar 100 Wörter eines Textes so überprüfe (in entsprechend kurzer Zeit), oder ? |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Du kannst selbstverständlich auch mehrere Wörter bzw. einen ganzen Satz mit einem Request prüfen lassen.
Übrigens: Ich habe vorhin begonnen eine Komponente für Google Spellchecker zu entwickeln. Wenn sie fertig ist (was wohl nicht mehr lange dauern wird), möchte ich sie u. a. hier als OpenSource veröffentlichen. |
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Hört sich interessant an!
Ich hab mal mit dem obigen Quelltext weiter gemacht und die Auswertung klappt jetzt sogar mit der XML-Komponente von Lazarus :thumb: Allerdings ist mir noch ein Problem aufgefallen. Die Antwortvorschläge kommen über den ResponseStream scheinbar nicht immer in gleichen Abständen rein. Hier mal ein Beispiel mit Quelltext:
Delphi-Quellcode:
Der Inhalt des ResponseStrings:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, IdHTTP, Forms, Controls, Graphics, Dialogs, StdCtrls, DOM, XMLWrite, XMLRead; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; IdHTTP1: TIdHTTP; Memo1: TMemo; Memo2: TMemo; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var XMLString: TStrings; SendStream, ResponseStream: TStringStream; TextToCheck, Str1: String; XMLDoc : TXMLDocument; i: Integer; begin TextToCheck := 'Wass ist mit dem getartetn Teest'; // der Satz (oder Wort) welcher geprüft / korrigiert werden soll XMLString := TStringList.Create; try XMLString.Add('<?xml version="1.0" encoding="UTF-8"?>'); XMLString.Add('<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">'); XMLString.Add(' <text>' + TextToCheck + '</text>'); XMLString.Add('</spellrequest>'); IdHTTP1.Request.Accept := '*/*'; IdHTTP1.Request.ContentType := 'text/xml'; IdHTTP1.Request.Connection := 'Keep-Alive'; IdHTTP1.HandleRedirects := True; SendStream := TStringStream.Create(XMLString.Text); ResponseStream := TStringStream.Create(''); try IdHTTP1.Post('http://www.google.com/tbproxy/spell?lang=de', SendStream, ResponseStream); Memo1.Text:= ResponseStream.DataString; except on E: Exception do ShowMessage('Fehler: ' + E.Message); end; //ResponseStream in XML-Format wandeln ResponseStream.Position:= 0; XMLDoc:= Nil; ReadXMLFile(XMLDoc,ResponseStream); //Ausgabe der Wort-Vorschläge for i:= 0 to (XMLDoc.DocumentElement.ChildNodes.Count - 1) do begin Memo2.Lines.Add(utf8encode(XMLDoc.DocumentElement.ChildNodes.Item[i].FirstChild.TextContent)); //utf8encode wichtig ! sonst statt Umalauten nur '?' end; finally FreeAndNil(ResponseStream); FreeAndNil(XMLString); FreeAndNil(SendStream); FreeAndNil(XMLDoc); end; end; end.
Code:
Komisch wenn ich es aus der Memobox ausschneide und hier Einfüge stimmen die Abstände ja :shock:
<?xml version="1.0" encoding="UTF-8"?><spellresult error="0" clipped="0" charschecked="32"><c o="0" l="4" s="1">Was Ass Fass Hass Wams</c><c o="17" l="9" s="0">gestarteten gehärteten getakteten getasteten gewarteten</c><c o="27" l="5" s="0">Teestd Test Teeast Teeist Teeost</c></spellresult>
Bei mir erscheinen die Vorschläge für 'getartetn' statt wie oben so:
Code:
gestarteten gehärteten getakteten getastetengewarteten.
|
AW: Mit IdHttp (Indy) Text in Feld auf Webseite eintragen
Ah ok hat sich geklärt, bei Bummi steht ja schon die Lösung. Man kann einfach das #9 Zeichen durch #13#10 ersetzen bei der Ausgabe (oder sonst was man halt braucht...). Die Ausgabe von oben wäre dann z.B:
Delphi-Quellcode:
//Ausgabe der Wort-Vorschläge
with XMLDoc.DocumentElement.ChildNodes do begin for i:= 0 to (Count - 1) do begin Memo2.Lines.Add(StringReplace(utf8encode(Item[i].FirstChild.TextContent),#9,#13#10,[rfReplaceAll])); //utf8encode wichtig! Sonst statt Umalauten nur "?" angezeigt. end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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