Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

Servus und guten Morgen,

Mr. Unix, wie immer ein Stern am Perl-Himmel :D

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 :D

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 :D

Gruß,

bytebrain

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.