bytebrain Geschrieben 6. November 2008 Geschrieben 6. November 2008 Hallo Zusammen, ich habe folgendes Problem: Mittels LWP::UserAgent versende ich per POST Daten an eine URL (https). Der Webserver wertet die Daten aus und schickt mir eine Antwort zurück. Sobald ich diese Antwort in Empfang nehme, bekomme ich folgende Warn-Meldung: Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/share/perl5/LWP/Protocol.pm line 114 Ich habe schon versucht, den Datenstring, den ich verschicke nach utf8 zu kodieren, was auch funktioniert. Die Fehlermeldung verschwindet. Leider kann der Server, der meine Daten empfängt diese nicht mehr interpretieren. Ich habe schon versucht, die Stelle, welche den Fehler provoziert in ein eval{} zu packen, aber das hilft auch nicht Anbei mal mein Perl-Code: #!/usr/bin/perl use strict; use warnings; use diagnostics; use LWP::UserAgent; my $www = LWP::UserAgent->new; $www->agent("MyAgent/0.1 "); ### $url und $string werden als Parameter übergeben. ### $url enthält die URL, $string die Werte, die per POST verschickt werden my $req = undef; $req = HTTP::Request->new(POST => $url); $req->content_type('application/x-www-form-urlencoded'); #$req->content( utf8::decode($string) ); $req->content( $string ); my $res = undef; $res = $www->request( $req ); ### HIER PASSIERT DER FEHLER! # return $res->decoded_content; ### FUNZT AUCH NET return $res->content; Hat jmd. noch einen Rat für mich? Selbst googln hat mich nicht wirklich schlauer gemacht Grüße, bytebrain Zitieren
bigvic Geschrieben 7. November 2008 Geschrieben 7. November 2008 Hi, mein google sagt: chklinks If you encounter warnings like this: Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/share/perl5/LWP/Protocol.pm line 114. This is a LWP::Protocol issue when working with HTML::Parser version ≥ 3.40. See CPAN RT Bug#20274 for a LWP::Protocol patch on this. ciao, vic Zitieren
Mr Unix Geschrieben 14. November 2008 Geschrieben 14. November 2008 Da bin ich wiedermal... Ich habe schon versucht, den Datenstring, den ich verschicke nach utf8 zu kodieren [...] Na dann gucken wir uns die Fehlermeldung und deinen Code doch nochmal an. Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/share/perl5/LWP/Protocol.pm line 114 Perl beschwert sich, klar - aber nicht weil du kein (oder doch?) UTF-8 sendest, sondern weil der Server UTF-8 zurueckgibt und die Module in deiner Steinzeitversion UTF-8 nocht nicht so wollen. Ein paar spontane Ideen: Loesung 1: (einfach und sauber): Module updaten (per CPAN/bsdpan/Packagemanager/wasauchimmer...) Loesung 2: (naja... akzeptabe, wenn du keine Updates machen willst) Falls du noch mehr als nur ein Formular abschicken willst, kannst du auch WWW::Mechanize verwenden. Dies ist auch eine Subclass von LWP::USerAgent, aber wenn ich mich nicht allzusehr taeusche, kuemmert sich das Modul selbst um seine Encodingthemen. Loesung 3: (haesslich, schwierig und uebrigens bleibt dein Problem dann bei allen anderen Scripten auch bestehen): Du nimmst LWP::UserAgent als deine base und passt die SUPPER:: Methode des caller() von request() an. Nicht empfehlenswert! Und wenn ich schon dabei bin... Ich wuerde auch gerne ein paar Anmerkungen zum Code machen... Konstruktiv gemeint, nicht boshaft! #!/usr/bin/perl use strict; use warnings; use diagnostics; use LWP::UserAgent; my $www = LWP::UserAgent->new; $www->agent("MyAgent/0.1 "); [COLOR="Red"]# Du kannst dem new Konstruktor gleich einige Attribute # mitgeben. Unter anderem auch den Wert fuer den Schluessel "agent".[/COLOR] ### $url und $string werden als Parameter übergeben. ### $url enthält die URL, $string die Werte, die per POST verschickt werden my $req = undef; [COLOR="Red"]# Du brauchst $req nicht zu "initialisieren". $req waere per # default schonmal undef und ausserdem aenderst du doch sowieso den Wert # gleich danach?[/COLOR] $req = HTTP::Request->new(POST => $url); [COLOR="Red"]# Gut.... Du willst einen POST Request absetzen. Ich sehe keinen # Grund sich hier Umstaende mit der request() Methode zu machen... # Verwende doch einfach $ua->post( $url, \%form )[/COLOR] $req->content_type('application/x-www-form-urlencoded'); [COLOR="Red"]# application/x-www-form-urlencoded ist der Defaultwert. Du # brauchst das hier nicht nochmal angeben.[/COLOR] #$req->content( utf8::decode($string) ); [COLOR="Red"]# ACHTUNG! Bei utf8 handelt es sich um ein Pragma. # Sobald du "use utf8" verwendest, verwendest du utf8 im [b]gesamten[/b] # [b]Projekt[/b]. "no utf8" dagegen deaktiviert dir den Kaese. # Dazu kommt noch, dass diese Methode nicht beliebige # Encodings bearbeiten kann. Wenn du mit Encodings kaempfen musst, # dann nimm dir lieber aus Encode.pm die Sub from_to().[/COLOR] $req->content( $string ); my $res = undef; [COLOR="Red"]#Auch hier koenntest du direkt my $res = $www.... schreiben. # Ja, es sieht trivial aus, aber du hast hier vier Anweisungen und einen # Methodenaufruf die unnoetig sind. Waere das in irgendeiner Art von # Schleifendurchlauf - z.b. for(1..10000000) - dann wuerde dir Benchmark.pm # klar sagen, dass dies so wesentlich langsamer ist. # Mich wundert nur, dass das diagnostic pragma deswegen nicht schimpft... [/COLOR] $res = $www->request( $req ); ### HIER PASSIERT DER FEHLER! # return $res->decoded_content; ### FUNZT AUCH NET return $res->content; Hat jmd. noch einen Rat für mich? Selbst googln hat mich nicht wirklich schlauer gemacht Wie bereits erwaehnt: Updaten! Dein System scheint ja mindestens drei Jahre alt zu sein... Wenn Google und gesunder Perlverstand scheitern hilft fast immer auch perl -d was jedoch sehr muehsam ist. Wuerde mich interessieren wie du es nun geloest hast... mfg Unix Zitieren
bytebrain Geschrieben 17. November 2008 Autor Geschrieben 17. November 2008 Servus und guten Morgen, Mr. Unix, wie immer ein Stern am Perl-Himmel Ich habe mir den Rat von victorinox zu Herzen genommen und unseren Admins Anweisung gegeben, die Perl-Module mal zu updaten. Bin mal gespannt, wann die armen Kerle dazu kommen Ich habe mein Script mal umgeschrieben (vor deinen Tipps ^^). ### Hier sind halt Shebang, Variablen, Module ... ### %post wird in einer Schleife zusammengebaut... my $www = LWP::UserAgent->new; $www->agent( 'MyAgent/0.1' ); my $response = $www->post( $url, \%post ); return $response->decoded_content; Aber trotzden danke Gruß, bytebrain Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.