Autor Beitrag
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Do 11.10.12 18: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:

ausblenden 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.

_________________
Hasta La Victoria Siempre
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.10.12 06:10 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 12.10.12 07: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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?

_________________
Hasta La Victoria Siempre
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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:

ausblenden 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.

_________________
Hasta La Victoria Siempre
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.10.12 01:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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..

_________________
Hasta La Victoria Siempre
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.

_________________
"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 19:22, insgesamt 1-mal bearbeitet
Terra23 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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).

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 96
Erhaltene Danke: 24


Delphi 2010, C# (VS 2012), Objective-C, Java
BeitragVerfasst: So 14.10.12 19:27 
user profile iconTerra23 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: So 14.10.12 19:35 
... offenbar nicht. Was ist denn daran falsch? Kann ja nur der Prozentwert sein.

_________________
Hasta La Victoria Siempre
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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.
ausblenden 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.

_________________
"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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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?
Einloggen, um Attachments anzusehen!
_________________
Hasta La Victoria Siempre
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.10.12 20:37 
- Nachträglich durch die Entwickler-Ecke gelöscht -
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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...

_________________
Hasta La Victoria Siempre
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: 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"?

_________________
Hasta La Victoria Siempre
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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 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.

Für diesen Beitrag haben gedankt: Nersgatt, Terra23