Thread CGI.pm und Ampersand/escape
(15 answers)
Opened by bianca at 2010-07-29 11:33
PERFEKT! Ich danke Dir. Habs gefunden und eingebaut.
Der Vollständigkeit halber nochmal der Code inkl. Select Feld Generierung. Wenn man oben Zeile 23 rausnimmt sieht man an der Ausgabe, was mein urspr. Problem war. Hätte ich sofort erkannt, dass es nicht an SOAP::Lite liegt, hätte ich natürlich den betreffenden Schnipsel gleich dazu getan. Sorry, war keine Absicht. Bin durch Deine Hilfe erst drauf gekommen. Wo wir den Code gerade hier haben. In Zeile 119 ff hab ich noch ein Problem mit hidden Feldern und dem CGI Modul beschrieben. Kennt das jemand und weiß zufällig eine Lösung dafür? Sonst ist nicht so schlimm, manuell das Feld zu erzeugen geht auch gut. 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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 #!/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; $cgi -> autoEscape(0); # don't escape & because Data from Server is correct! 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>"); if (lc ($result -> {'done'}) eq 'no') { # prepare next step if ( defined $result -> {'fields'} && ref ($result -> {'fields'}) eq 'ARRAY' && scalar (@{$result -> {'fields'}}) ) { my $error = 0; my $form_fields = ''; for my $i (0 .. scalar (@{$result -> {'fields'}}) - 1) { my $field = build_formfield ($result -> {'fields'} -> [$i]); if ($field ne '') { $form_fields .= $field; } else { $error = $i + 1; last; } } if (!$error) { print $cgi -> start_form (); print $form_fields; print $cgi -> hidden ('acc_user',$account{'acc_user'}); print $cgi -> hidden ('acc_pass',$account{'acc_pass'}); print $cgi -> end_form (); } else { print $cgi -> p ("Sorry, unexpected value(s) in 'field' array # " . ($error - 1) . " in server response IBAN Method get_form!"); print "<pre>" . Dumper (\$result) . "</pre>"; } sub build_formfield { # function to build form field for next step my %deref = %{$_[0]}; my $ref_hidden = $_[1]; my $return = ''; if ( ref (\%deref) eq 'HASH' && defined $deref{'type'} && defined $deref{'id'} && $deref{'id'} ne '' && defined $deref{'value'} && defined $deref{'length'} && defined $deref{'label'} ) { if (lc ($deref{'type'}) eq 'hidden') { $return .= $cgi -> hidden ($deref{'id'},$deref{'value'}); # The following line should be $return .= $cgi -> hidden ('IBAN_KEY',$deref{'id'}); # but CGI module doesn't build it right, takes everytime the wrong value for field # Perhaps a bug? I don't know and do it manually: $return .= '<input type="hidden" name="IBAN_KEY" value="' . $deref{'id'} . '" />'; } elsif (lc ($deref{'type'}) eq 'text') { if ($deref{'label'} ne '') { $return .= '<p>' . $deref{'label'} . ': '; } $return .= $cgi -> textfield ($deref{'id'},$deref{'value'},$deref{'length'},$deref{'length'}); if (defined $deref{'newline'} && $deref{'newline'} eq 'yes') { $return .= '</p>'; } $return .= '<input type="hidden" name="IBAN_KEY" value="' . $deref{'id'} . '" />'; } elsif (lc ($deref{'type'}) eq 'submit') { $return .= $cgi -> submit ('',$deref{'label'}); } elsif (lc ($deref{'type'}) eq 'select') { if ($deref{'label'} ne '') { $return .= '<p>' . $deref{'label'} . ': '; } my %hash_for_popup; my @labels = @{$deref{'options'}}; my @values = @{$deref{'optionids'}}; @hash_for_popup{@values} = @labels; $return .= $cgi -> popup_menu ( -name => $deref{'id'}, -values => $deref{'optionids'}, -labels => \%hash_for_popup, ); if (defined $deref{'newline'} && $deref{'newline'} eq 'yes') { $return .= '</p>'; } } } return $return; } } else { print $cgi -> p ("Sorry, unexpected value(s) of 'fields' in server response IBAN Method get_form!"); print "<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; mod-edit pq: teilbaum hidden() Last edited: 2010-07-29 14:01:31 +0200 (CEST) 10 print "Hallo"
20 goto 10 |