soy nuevo en Perl y quería comentaros un problema que no consigo solucionar a ver si me podéis echar una mano. Quiero hacer un CGI que sea capaz de recibir un mensaje XML que le llegue a través de un HTTP POST, y responda con un HTTP RESPONSE con otro mensaje XML diferente. Al intentarlo me he encontrado con 2 dificultades: por un lado no soy capaz de recibir bien el mensaje XML que me llega con el HTTP POST. Por otro lado, no he conseguido averiguar la forma de generar un HTTP RESPONSE.
El script de Perl con el que genero el HTTP POST es el siguiente:
Using perl Syntax Highlighting
- # Create a user agent object
- use LWP::UserAgent;
- use strict;
- use HTTP::Request::Common;
- my $ua = LWP::UserAgent->new;
- $ua->agent("MyApp/0.1 ");
- #xml message
- my $message = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
- <TollChargeExchangeMessage CreateRef=\"Info24\" MsgVer=\"2.2\" RegionalUnits=\"Metric\" TimeZone=\"UTC\">
- <msgId>1bdf48c5</msgId>
- <msgSender>
- <informationSenderID>2bdf48c5</informationSenderID>
- </msgSender>
- <msgExpiryTime>2010-04</msgExpiryTime>
- </TollChargeExchangeMessage>";
- # Create a request
- my $req = HTTP::Request->new(POST => 'direccion_script_perl');
- # $req->content_type('application/x-www-form-urlencoded');
- $req->content_type('text/xml');
- $req->content($message);
- # Pass request to the user agent and get a response back
- my $res = $ua->request($req);
- #Check the outcome of the response
- if ($res->is_success) {
- print $res->content;
- }
- else {
- print $res->as_string;
- print $res->status_line, "\n";
- }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Y el script con el que intento recibir el mensaje XML (del HTTP POST) y contestar con otro mensaje XML (en el HTTP RESPONSE) es el siguiente:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use CGI qw(:standard -debug);
- use CGI::Carp qw(fatalsToBrowser);
- use strict;
- use LWP::UserAgent;
- use HTTP::Request::Common;
- use XML::TreePP;
- use Data::Dumper;
- print
- <span class="posthilit">header</span>,
- start_html('PRUEBA'),
- h1('PRUEBA'),
- hr,
- p('Welcome'),
- hr;
- #######################################################################
- ###Comprobación del código y la contraseña############################
- #!/usr/local/bin/perl -w
- use CGI; # load CGI routines
- my $query = CGI->new;
- my $senderID = $query->param('SenderID');
- my $login = $query->param('Login');
- if($senderID != 0000 ){
- print p('senderID not correct');
- #exit(0);
- }
- if($login != 1111 ){
- print p('Login not correct');
- #exit(0);
- }
- #print p($senderID);
- #print p($login );
- print end_html;
- #########################################################################
- ## read XMl content######################################################
- my $buffer; #inicializa contenedor
- my %Variables; #inicializa el hash
- #Lee el Standard input
- my $tpp = XML::TreePP->new();
- read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
- my $tree = $tpp->parse($buffer);
- print p($tree->{msgId});
- ##########################################################################
- #########Http response####################################################
- # Create a User Agent object
- my $ua = new LWP::UserAgent;
- $ua->agent("arena/1.0");
- my $response = HTTP::Response->new(200);
- my $mes= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
- <TollChargeExchangeMessage CreateRef=\"Info24\" MsgVer=\"2.2\" RegionalUnits=\"Metric\" TimeZone=\"UTC\">
- <msgId>1bdf48c5</msgId>
- <msgTimeStamp>2009-10</msgTimeStamp>
- <msgSender>
- <informationSenderID>2bdf48c5</informationSenderID>
- <informationSenderName>Name of TSP</informationSenderName>
- </msgSender>
- <msgExpiryTime>2010-04</msgExpiryTime>
- </TollChargeExchangeMessage>";
- $response->content($mes);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Lo que a mí me gustaría es poder imprimir por pantalla el dato <msgId> del mensaje XML del HTTP POST para comprobar que soy capaz de leer bien el mensaje XML. También me gustaría poder responder con un HTTP RESPONSE. Sé que no lo hago bien con las líneas que he puesto, pero no he encontrado la forma de hacerlo.
Si pudierais echarme una mano con ese par de cosas os lo agradecería mucho. Muchas gracias, y perdón por el rollo.
Un saludo.