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
/// Erzeuge eine StringList...
Quellstream := TStringList.Create;
Try
/// Lade den Quellcode in die Stringlist und nehme dazu die URL aus dem Edit-Feld...
Quellstream.Text := IdHTTP1.Get(Edit1.Text);
/// Falls das Memo bereits gefüllt ist, leere es zur Sicherheit...
Memo1.Clear;
/// Zeige mir den Quelltext zur Kontrolle im Memo an...
Memo1.Text := Quellstream.Text;
Finally
/// Gebe die Stringlist wieder frei...
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
/// Erzeuge eine StringList...
Quellstream := TStringList.Create;
Try
/// Lade den Quellcode in die Stringlist und nehme dazu die URL aus dem Edit-Feld...
Quellstream.Text := IdHTTP1.Get(TIdUri.UrlEncode(Edit1.Text)); -> in Edit1.Text steht die URL drin
/// Falls das Memo bereits gefüllt ist, leere es zur Sicherheit...
Memo1.Clear;
/// Zeige mir den Quelltext zur Kontrolle im Memo an...
Memo1.Text := Quellstream.Text;
Finally
/// Gebe die Stringlist wieder frei...
Quellstream.Free;
End;
end;


Hat noch jemand ne Idee?

Moderiert von user profile iconNarses: 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 Suche in der Delphi-Reference 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

user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:

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,
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
@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 user profile iconNarses: Zitat mit Tags versehen.


Terra23 - So 14.10.12 21:38

Moderiert von user profile iconNarses: 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

user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: Zitat mit Tags versehen.