Thread CGI.pm und Ampersand/escape (15 answers)
Opened by bianca at 2010-07-29 11:33

bianca
 2010-07-29 11:33
#140126 #140126
User since
2009-09-13
6991 Artikel
BenutzerIn

user image
Guten Morgen,
ich hab noch ein winziges Problemchen beim Erhalt von HTML Daten mit dem Modul SOAP::Lite.

Es werden Daten geliefert mit denen ein HTML Select Feld aufgebaut wird. Darin sind Umlaute enthalten die mit diesem Ampersand "codiert" sind. Allerdings bin ich etwas verwirrt, denn manchmal sind die quasi doppelt codiert, sprich aus einem ä wird ein ä. Diese Doppelcodierung hab ich auf einem Linux/Apache/Perl 5.8.5/Modul 0.710.08 UND Windows/Strawberry 5.10.1/Modul 0.711 lokal über den Webserver aufgerufen -> Browser -> Quelltext anzeigen.

Rufe ich das selbe Script auf Windows/Strawberry 5.10.1/Modul 0.711 in der DOSe auf, bekomme ich ein sauberes ä.

Womit kann das zu tun haben, dass es sich unterschiedlich verhält? Wo ist mein Ansatzpunkt?

Anbieter hab ich befragt, er sagt, dies entspräche einer Art von Escaping der Sonderzeichen, was in SOAP Dingen so korrekt sei. Ein PHP SOAP Client würde dies alles korrekt machen, daher suchen wir den Fehler nun im SOAP Modul.

Folgender Code zum Spielen (URL darf erhalten bleiben und für Tests hier genutzt werden, ist vom Anbieter legitimiert!):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/perl -w
use 5.008;
use strict;
use diagnostics;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use Data::Dumper;
$Data::Dumper::Sortkeys = \&dumper_filter;
sub dumper_filter {
    my ($hash) = @_;
    return [(sort {lc $a cmp lc $b} keys %$hash)];
}
$| ++;
my $iban_wsdl_getform = 'http://dev.iban-bic.com/Riban/soap2/';

my %account = (
    'acc_user'  => 'test',
    'acc_pass'  => 'test',
);

my $cgi = CGI -> new;
print $cgi -> header;
print $cgi -> start_html ('Test Escape SOAP Content');
print $cgi -> p ('- Begin of script -');

my $modul = 1;
eval "use SOAP::Lite; 1;" or $modul = 0;
if ($modul) {
    my $version = SOAP::Lite -> VERSION;
    print $cgi -> p ("SOAP::Lite $version detected");
    my $soap = SOAP::Lite -> new ();

    # get input mask
    $soap -> proxy ($iban_wsdl_getform);
    my ($hash_ref,@params);

    my %parameter = (
        'country'   => 'NL',
    );

    foreach my $key (%parameter) {
        push @params,
            \SOAP::Data -> value (
                SOAP::Data -> name ('key' => $key) -> type ('xsd:string'),
                SOAP::Data -> name ('value' => $parameter{$key}) -> type ('xsd:string'),
            );
    }
    print $cgi -> p ('SENDE:<br><pre>' . Dumper (\@params) . '</pre>');
    eval {
        # do it in eval because smallest errors always cause hard abort in SOAP::Lite
        # !!ATTENTION!! The SOAP map always must be the first parameter,
        # username und password always have to be second and third parameter!
        $hash_ref = $soap -> get_form (
            SOAP::Data -> name ('params' => \@params) -> type ('tns:Map'),
            SOAP::Data -> name ('user' => $account{'acc_user'}) -> type ('xsd:string'),
            SOAP::Data -> name ('password' => $account{'acc_pass'}) -> type ('xsd:string'),
        );
    };
    if (defined $hash_ref) {
        my $result = $hash_ref -> result;
        print $cgi -> p ("ERHALTE:<br><pre>" . Dumper (\$result) . "</pre>");
    }
    else {
        print $cgi -> p (
            "Sorry, one or more internal errors occurred!"
            . "<br>Do you perform your request in correct order, first=map, second=user, third=password?"
        );
    }
}
else {
    print $cgi -> p ("Sorry, can't find SOAP::Lite!");
}
print $cgi -> p ('- End of script -');
print $cgi -> end_html;
10 print "Hallo"
20 goto 10

View full thread CGI.pm und Ampersand/escape