Autor |
Beitrag |
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Do 11.10.12 17:55
Hi Leute!
Ich hatte vor einiger Zeit mal gefragt, wie man Bilder anzeigen lässt, deren URL man aus einem Quelltext ausliest.
Nun habe ich komischerweise ein Problem bekommen:
idHTTP zeigt mir eine Fehlermeldung, obwohl die URL, die ich benutze, korrekt ist.
Ich poste euch mal meinen Code, damit ihr es ein wenig nachvollziehen könnt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); begin Quellstream := TStringList.Create; Try Quellstream.Text := IdHTTP1.Get(Edit1.Text); Memo1.Clear; Memo1.Text := Quellstream.Text; Finally Quellstream.Free; End; end; |
Ich habe mal einige URLs:
http://www.yugioh-wiki.de/wiki/A/V-Änderer
--> Hier geht es, wenn ich das "Ä" in %C3%84 verändere (wenn ich die URL aus dem Browser ins Edit-Feld kopiere, wird aus dem "Ä" automatisch %C3%84
http://www.yugioh-wiki.de/wiki/Jenseits_-_Die_"A"-Zone
--> Hier geht es nicht, obwohl der Browser auch hier die "" in Prozentwerte umwandelt. Wenn ich die "" manuell ins Edit-Feld eingebe, geht es auch nicht.
Wie kann ich das Problem, dass idHTTP mit den Anführungszeichen hat, ändern?
Die Fehlermeldung:
Zitat: | Im Projekt "Test.exe" ist eine Exception der Klasse EIdHTTPProtocolException aufgetreten. Meldung: 'HTTP/1.1 404 Not Found'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. |
_________________ Hasta La Victoria Siempre
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 12.10.12 05:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 12.10.12 06:53
Guck Dir mal die (class-)function TIdUri.UrlEncode an.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Fr 12.10.12 19:11
@Frühlingsrolle: Das Problem ist ja, dass er die Seite weder mit manuell eingegebenen "" noch mit den Prozentangaben aufruft, obwohl die Seite zweifelsfrei existiert.
@Nersgatt: Wo und wie mache ich das und wonach soll ich gucken?
_________________ Hasta La Victoria Siempre
|
|
Nersgatt
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 12.10.12 21:03
Die Sonderzeichen müssen Codiert werden. Der Browser macht das für Dich unsichtbar im Hintergrund. In Deiner Anwendung musst Du Dich aber selbst drum kümmern. Glücklicherweise gibt es bei den Indykomponenten schon eine fertige Function, die das für Dich erledigt. Du musst sie nur nutzen.
Das sähe dann so aus:
Delphi-Quelltext 1:
| Quellstream.Text := IdHTTP1.Get(TIdUri.UrlEncode(Edit1.Text)); |
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: Sa 13.10.12 13:00
Hi!
Danke für deinen Post. Das klappt allerdings leider auch nicht.
Knackpunkt: Diese URL -> http://www.yugioh-wiki.de/wiki/Jenseits_-_Die_"A"-Zone
Die kann nicht aufgerufen werden, weder mit URLEncode noch mit URLDecode (habe beides mal probiert).
Hier mal mein Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); begin Quellstream := TStringList.Create; Try Quellstream.Text := IdHTTP1.Get(TIdUri.UrlEncode(Edit1.Text)); -> in Edit1.Text steht die URL drin Memo1.Clear; Memo1.Text := Quellstream.Text; Finally Quellstream.Free; End; end; |
Hat noch jemand ne Idee?
Moderiert von Narses: Doppelposting entfernt.
_________________ Hasta La Victoria Siempre
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.10.12 00:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 13:58
Edit: Habe das jetzt soweit hinbekommen, allerdings ist die Lösung mit dem TWebBrowser doch eher unelegant, wie ich finde. Ich bin zwar dankbar für den Tipp und als Notlösung ist das auch wohl gut geeignet .. allerdings wäre eine Lösung mit idHTTP oder anderen gleichartigen Komponenten bevorzugt gewünscht..
_________________ Hasta La Victoria Siempre
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 14.10.12 17:01
Die Seite existiert auch im Browser nicht. Ist das so gedacht?
Ansonsten mach halt die Ersetzung der "störrischen" von Hand. Solange das nur eine Hand voll Zeichen sind, die Indy nicht mag, geht das ja noch wunderbar mit STRINGREPLACE.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Zuletzt bearbeitet von Martok am So 14.10.12 18:22, insgesamt 1-mal bearbeitet
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 17:10
@Martok: Ich wünschte, es wäre so einfach. Wenn ich die Anführungszeichen mit StringReplace ersetze und dafür die jeweiligen Prozentwerte einsetze, spuckt idHTTP mir trotzdem eine Fehlermeldung aus und beschwert sich, dass die URL nicht gefunden wurde. Die Idee hatte ich auch schon aber leider macht idHTTP da nicht mit...
Edit: Hier mal mein Code zum Nachvollziehen (wobei ich sicher bin, dass das Ersetzen der Umlaute und der "" auch einfacher geht als ich es gemacht habe).
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| SR := Edit1.Text; SR := StringReplace(SR, 'ä', '%C3%A4', [rfReplaceAll]); SR := StringReplace(SR, 'ö', '%C3%B6', [rfReplaceAll]); SR := StringReplace(SR, 'ü', '%C3%BC', [rfReplaceAll]); SR := StringReplace(SR, 'Ä', '%C3%84', [rfReplaceAll]); SR := StringReplace(SR, 'Ö', '%C3%96', [rfReplaceAll]); SR := StringReplace(SR, 'Ü', '%C3%9C', [rfReplaceAll]); SR := StringReplace(SR, '"', '%34', [rfReplaceAll]); URL := SR; Memo1.Text := idHTTP1.Get(TIdURI.URLEncode(URL)); |
_________________ Hasta La Victoria Siempre
|
|
vagtler
Beiträge: 96
Erhaltene Danke: 24
Delphi 2010, C# (VS 2012), Objective-C, Java
|
Verfasst: So 14.10.12 18:27
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 18:35
... offenbar nicht. Was ist denn daran falsch? Kann ja nur der Prozentwert sein.
_________________ Hasta La Victoria Siempre
|
|
Martok
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 14.10.12 18:36
Der Fehler ist übrigens nicht 404, sondern 400 Bad Request. Du encodest nämlich alles doppelt.
Dann, wie vagtler schon schreibt, du encodest in die falsche Zahl. Hexadezimal, nicht Dezimal!
Wenn man das repariert, funktioniert auch alles.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var sr: string; begin SR:= Edit1.Text; sr:= TIdURI.URLEncode(SR); SR:= StringReplace(SR, '"', '%22', [rfReplaceAll]); Memo1.Text:= idHTTP1.Get(SR); |
Wie ich bereits erwähnte,
Martok hat folgendes geschrieben : | Die Seite existiert auch im Browser nicht. Ist das so gedacht? |
Und was macht ein Wiki, wenn es eine Seite nicht findet? Richtig, es antwortet mit 404 Not Found.
Und da waren wir ganz am Anfang schon.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 18:53
@vagtler: Gut, der Wert war wohl falsch. Irgendwie bin ich nicht in der Lage gewesen, eine Tabelle zu finden oder richtig zu lesen, um auf %22 zu kommen.
@Martok: Aber die URL existiert doch? Ich schnall das nicht und irgendwie muss ich ehrlich gestehen, dass mich das alles gerade total frustriert. Nicht nur, dass ich keine richtige Tabelle gefunden habe, die mir den richtigen Wert für die " liefert, nein, ich kriege auch immer die 404-Meldung.
Ich habe mal einen Screenshot gemacht. Die URL existiert. Oder bin ich inzwischen total dämlich?
Einloggen, um Attachments anzusehen!
_________________ Hasta La Victoria Siempre
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 14.10.12 19:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
mandras
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: So 14.10.12 19:41
Darf ich die Lösung des Rätsels nennen?
Ich fand sie mittels Firebug.
Das "404 - not found" ist korrekt. Die Seite existiert einfach nicht.
Versuch mal: www.yugioh-wiki.de/wiki/c13b159dxxWAS
Kommt bis auf die Überschrift das gleiche bei raus wie bei http://www.yugioh-wiki.de/wiki/Jenseits_-_Die_"A"-Zone.
Nun des Rätsels Lösung:
Was da kommt IST die "NOT FOUND"-Seite! Sie wird dynamisch generiert und sieht halt aus wie eine normale Seite.
Als Überschrift und unterhalb von "Aufgrund eines Updates..." wird noch der Name der angeforderten Seite eingesetzt.
Für diesen Beitrag haben gedankt: Martok
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 19:58
@mandras: Die Seite existiert, daran gibt es keinen Zweifel.
@Frühlingsrolle: Das Problem mit TWebBrowser ist...
Ich lade die URL in den Browser (NAVIGATE) und im OnDocumentComplete-Ereignis lade ich den Quelltext ins Memo. Ich erhalte einen Laufzeitfehler (Zeile 54: Syntaxfehler) sowie (Zeile 471: '_gat' ist undefiniert). Das passiert, egal welche Wiki-Seite ich aufrufen will...
_________________ Hasta La Victoria Siempre
|
|
mandras
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: So 14.10.12 20:06
Terra23 hat folgendes geschrieben : | @mandras: Die Seite existiert, daran gibt es keinen Zweifel. |
Der Server ist anderer Meinung und liefert deshalb einen 404 zusammen mit weiterem HTML-Text.
Sodele.. Ein Browser zeigt nun den Text an weil er ja eine Fehlermeldung, welche vom Server kommt, anzeigen möchte.
IDHTTP prüft aber zuerst den Rückgabecode. Und wenn der nicht OK (oder ect redirect oder...) ist wird nun mal eine Ausnahme erzeugt, egal ob der Server nun weiteres HTML liefert oder nicht.
Prüfe mal die von mir oben gepostete URL.
Moderiert von Narses: Zitat mit Tags versehen.
|
|
Terra23
Beiträge: 872
Win 8
Delphi 7
|
Verfasst: So 14.10.12 20:38
Moderiert von Narses: Komplett-Zitat des letzten Beitrags entfernt.
Ja, habe ich getan. Die Seite lässt sich aufrufen und es lässt sich manuell (ich nutze Chrome) ein Quelltext anzeigen. Gleiches gilt bei der A-Zonen-Seite. Oder haben wir unterschiedliche Definitionen von "Seite existiert"?
_________________ Hasta La Victoria Siempre
|
|
mandras
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: So 14.10.12 21:01
Terra23 hat folgendes geschrieben : | Ja, habe ich getan. Die Seite lässt sich aufrufen und es lässt sich manuell (ich nutze Chrome) ein Quelltext anzeigen. Gleiches gilt bei der A-Zonen-Seite. Oder haben wir unterschiedliche Definitionen von "Seite existiert"? |
Es scheint so.
Ruf mal www.entwickler-ecke.de/xxx13xawd auf. Es wird auch Inhalt geliefert, dennoch liefert der Server den Code 404.
Im Browser würdest Du eine Seite sehen, idhttp.get würde 404-not found liefern.
Vielleicht hilft folgende Sichtweise, auch wenn sie sehr vereinfachend ist:
An den Server wird ein GET geschickt, solange der Server existiert und sich wohl fühlt beantwortet er die Anfrage auf irgendeine Art.
Code 200 sagt: Im Anhang findest Du die von Dir angeforderten Daten
Code 404 sagt: Das was Du wolltest habe ich nicht. Im Anhang ist ein Text der das Problem erläutert.
Das Problem entsteht dadurch daß ein Browser Code 200 und 404 gleich behandelt: Der Text im Anhang wird dargestellt.
IDHTTP unterscheidet aber (und das ist fest kodiert und läßt sich im Gegensatz zum Verhalten bei Redirects nicht abändern) und liefert bei Code 404 eine Ausnahme.
Ich habe mir gerade die Implementierung von IDHTTP angesehen (Versionsnr weiß ich gerade nicht), da existiert leider keine Möglichkeit auf die vom Server gelieferten Zusatzdaten zuzugreifen.
GGF kann man den Quellcode entspr. anpassen wenn man Zeit und Lust hat.
Moderiert von Narses: Zitat mit Tags versehen.
Für diesen Beitrag haben gedankt: Nersgatt, Terra23
|
|