Thread POST direkt auslesen ohne Formular (32 answers)
Opened by dater at 2010-02-10 15:55

sid burn
 2010-02-11 10:46
#132630 #132630
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
1) Auch hier ist der Code nicht vollständig, in deinem beispiel schickst du nichts ab, sondern du erstellst nur ein Request. Für das Absenden fehlt noch ein
Code: (dl )
$ua->request($req)


2) In deinem Fall solltest du einen weiteren Content-Type angeben. Komplett fertig sieht das dann so aus.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

my $url = 'http://localhost/cgi-bin/test.pl?PARTNERID=BECHTLE&PWD=TEST';
my $req = HTTP::Request->new("POST",$url);
#Daten an URL senden

$req->header('Content-Type' => 'text/xml');
$req->content("Hallo dies ist nur ein Test");

$ua->request($req);


3) Wenn du das machst dann kannst du in deinem CGI Skript die gesendeteten daten über
Code: (dl )
$q->param('POSTDATA')
auslesen. Daher anstatt deines Reads schreibst du ein.
Code: (dl )
my $input = $q->param('POSTDATA')


Ich habe dein CGI Skript mal angepasst so das es überhaupt lauffähig ist.

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
#!/usr/bin/env perl
use CGI;

print "Content-type: text/html\n\n";

my $q = new CGI;

#TODO
    #Timeout verhindern




#Gültige URL Parameter
my $strPARTNERID_valid ="BECHTLE";
my $strPWD_valid = "TEST";

#-----------------------------------------------------
#Umgebungsvariablen - bei Bedarf zum Testen
#
#$ENV{CONTENT_LENGTH};
#
#----------------------------------------------------

my @params = split(/&/,$ENV{QUERY_STRING});

foreach (@params){
    
    ($key, $val) = split (/=/,$_);
     $param{$key} = $val;
};




#Datenablage - in diesem Verzeichnis werden die Daten gespeichert
my $strDataPath = "/srv/www/webshop1/web888w/dattrans/backup_bechtle_orderresponse/";

#Eindeutiger Dateiname inkl. Pfad bilden aus Timestamp + Zufallszahl z.B.: /srv/www/webshop1/web888w/dattrans/backup_bechtle_order/20100209_345.xml
my $strTimeStamp = myCurrentDate().time();

#Randomize
my $strDateiname = $strDataPath.$strTimeStamp."_".int(rand()*1000).".xml";

#Uebergebene URL Parameter ueberpruefen
my $strPARTNERID = $param{PARTNERID};




if (length($strPARTNERID)>0 and ($strPARTNERID eq $strPARTNERID_valid)){
    warn "Alles OK - PARTNERID ist gueltig";
}
else{
    #in Datei loggen
    #Remote-Adresse,strPARTNERID
    #Response.Status = "401 Unauthorized"
}

my $strPWD = $param{PWD};


if(length($strPWD)>0 and ($strPWD eq $strPWD_valid)>0){
    warn "Alles OK -PWD gültig";
}
else{
    #in Datei loggen
    #Remote-Adresse,strPWD
    #Response.Status = "400";
}

#Daten auslesen
my $strData = "";
my $totalBytes;


my $input = $q->param('POSTDATA');
warn "INPUT: ", $q->param('POSTDATA'), "\n";

print $q->header('text/html');
print $input;

sub myCurrentDate {
    use DateTime;
    return DateTime->today->dmy('.');
}


1) Du solltest meine obengenannte Punkte aber noch selber einbauen
2) "use strict;" und "use warnings;" nicht vergessen!

Wenn du dann den Request abfeuerst bekommst man als ausgabe vom CGI im Error Log.

Code: (dl )
1
2
3
Alles OK - PARTNERID ist gueltig at /usr/lib/cgi-bin/test.pl line 52.
Alles OK -PWD g\xc3\xbcltig at /usr/lib/cgi-bin/test.pl line 64.
INPUT: Hallo dies ist nur ein Test
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de

View full thread POST direkt auslesen ohne Formular