URL-Validierung
Alexander
- perl
Servus,
frisch gestärkt aus dem (fast schneelosen und schlechtwettrigen) Winterurlaub und mit vollem Tatendrang zurückgekehrt habe ich mir auf die Fahne geschrieben, eine Perl-URL-Validierung zu bauen.
Soll heißen:
Ich möchte eine an ein Perl-Skript übergebene URL auf Validität überprüfen lassen.
Dies hat viele Gründe weshalb ich sowas haben möchte, so z.B. der Einsatz in Foren, Gästebüchern, Linklisten, etc.
Doch wie mache ich es am besten, denn schließlich soll es perfekt - nah, sagen wir besser "sehr gut" werden. Eine syntaktische Überprüfung ist schlecht, da erfunde URLs durchaus zulassen werden könnten. Bsp: http://mickey-maus-ist-doof.disney.de - wie wir alle wissen, ist Mickey Maus nicht doof und mit extrem hoher Wahrscheinlichkeit existiert diese URL nicht. --> Schlechter Weg...
Besserer Weg: Ich überprüfe nicht die syntaktische Korrektheit der URL, sondern die URL selbst. Sprich: Ich rufe dieses Dokument auf und überprüfe den Inhalt
use LWP::Simple;
$inhalt = get ($url);
Dies ist an sich schon ziemlich gut, da ich so mittels einfacher if-Abfrage checken kann, ob Inhalt von dieser URL übertragen wurde. Das Problem ist nur, dass das komplette Dokument ja übertragen wird, was an sich eigentlich nicht nötig wäre.
Hat einer von Euch eine bessere und eventuell schon verwirklichte Idee, z.B. nur die Header-Infos auszuwerten?
Viele Grüße
Alex :)
use Mosche;
Besserer Weg: Ich überprüfe nicht die syntaktische Korrektheit der URL, sondern die URL selbst. Sprich: Ich rufe dieses Dokument auf und überprüfe den Inhalt
use LWP::Simple;
$inhalt = get ($url);
Dies ist an sich schon ziemlich gut, da ich so mittels einfacher if-Abfrage checken kann, ob Inhalt von dieser URL übertragen wurde. Das Problem ist nur, dass das komplette Dokument ja übertragen wird, was an sich eigentlich nicht nötig wäre.
Du könntest mit Net::Ping überprüfen, ob der Server auf Ping Pakete antwortet. Doch Vorsicht: man kann Ping-Pakete auch durch ne Firewall blocken.
Andere Möglichkeit wäre es einen HTTP-Befehl abzusetzen und nur die Antwort des Servers abzuwarten (also nicht das Dokument an sich), da kenn ich mich aber nicht aus.
Tschoe qw(Matti);
Halihallo
Doch wie mache ich es am besten, denn schließlich soll es perfekt - nah, sagen wir besser "sehr gut" werden.
sehr gut ist oft sogar besser als perfekt, man denke an die 80/20-Lösung.
Eine syntaktische Überprüfung ist schlecht, da erfunde URLs durchaus zulassen werden könnten. Bsp: http://mickey-maus-ist-doof.disney.de - wie wir alle wissen, ist Mickey Maus nicht doof und mit extrem hoher Wahrscheinlichkeit existiert diese URL nicht. --> Schlechter Weg...
OK. Was ist, wenn ich in deinem Forum posten will, eine Bild-URL hinterlege, welches auf ein _noch nicht_ upgeloadetes Bild zeigt??? - Nun gut, selber schuld...
Besserer Weg: Ich überprüfe nicht die syntaktische Korrektheit der URL, sondern die URL selbst. Sprich: Ich rufe dieses Dokument auf und überprüfe den Inhalt
Braucht aber _wesentlich_ mehr Performance! - Aber wenn du nicht gleich 100'000 Einträge/Stunde abarbeiten musst, dürfte's gut gehn...
Dies ist an sich schon ziemlich gut, da ich so mittels einfacher if-Abfrage checken kann, ob Inhalt von dieser URL übertragen wurde. Das Problem ist nur, dass das komplette Dokument ja übertragen wird, was an sich eigentlich nicht nötig wäre.
Stimmt. Schluckt nur RAM-Speicher, Performance und Netzwerkressourcen.
Hat einer von Euch eine bessere und eventuell schon verwirklichte Idee, z.B. nur die Header-Infos auszuwerten?
Nun, du sagst es ja schon fast: Nur die Header-Infos lesen. Das HTTP-Protokol unterstützt die Methode HEAD (neben dem GET, welches bei LWP::Simple verwendet wird). Diese Methode liefert dir nur die Header-infos, also 200 OK bzw. 403 Document not found... etc.
perldoc HTTP::Request::Common
perldoc LWP::UserAgent
...
jetzt klar?
Anderer Lösungsansatz:
Vielleicht reicht's für deine Zwecke auch, einfach zu überprüfen, ob die Domain existiert (dann geht dein Mickymouse beispiel nicht, dennoch kann ich mein Bild auch noch später hochladen...).
Dann reicht ein simpler ping ( perldoc IO::Socket::INet ), der belastet die Performance noch weniger...
Viele Grüsse
Philipp
Hi,
use LWP::Simple;
$inhalt = get ($url);
Hat einer von Euch eine bessere und eventuell schon verwirklichte Idee, z.B. nur die Header-Infos auszuwerten?
was hältst Du von
use LWP::Simple;
my @result = head ($url);
und einem Blick in die Dokumentation von LWP::Simple?
Viele Grüße
Michael