Entwickler-Ecke
Internet / Netzwerk - idHTTP-Fehlermeldung trotz korrekter URL...
Terra23 - Do 11.10.12 18:55
Titel: idHTTP-Fehlermeldung trotz korrekter URL...
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. |
Delete - Fr 12.10.12 06:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
Nersgatt - Fr 12.10.12 07:53
Guck Dir mal die (class-)function TIdUri.UrlEncode an.
Terra23 - Fr 12.10.12 20: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?
Nersgatt - Fr 12.10.12 22: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)); |
Terra23 - Sa 13.10.12 14: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.
Delete - So 14.10.12 01:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
Terra23 - So 14.10.12 14: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..
Martok - So 14.10.12 18: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.
Terra23 - So 14.10.12 18: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)); |
vagtler - So 14.10.12 19:27
Terra23 hat folgendes geschrieben : |
Delphi-Quelltext 1:
| SR := StringReplace(SR, '"', '%34', [rfReplaceAll]); | |
Du machst es sechs mal richtig und dann fällt Dir nicht auf, dass diese Zeile falsch ist?
Terra23 - So 14.10.12 19:35
... offenbar nicht. Was ist denn daran falsch? Kann ja nur der Prozentwert sein.
Martok - So 14.10.12 19: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.
Terra23 - So 14.10.12 19: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?
Delete - So 14.10.12 20:37
- Nachträglich durch die Entwickler-Ecke gelöscht -
mandras - So 14.10.12 20: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:
http://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.
Terra23 - So 14.10.12 20: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...
mandras - So 14.10.12 21: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 - So 14.10.12 21: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"?
mandras - So 14.10.12 22: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
http://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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!