Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Recibir un XML con HTTP POST y generar un HTTP RESPONSE Responder al tema
Nuevo tema


Página 1 de 1  [ 5 mensajes ] 
 
Nota 2009-10-26 05:06 @254

Perlero Nuevo
Registrado: 2009-10-23 06:28 @311
Mensajes: 7
Recibir un XML con HTTP POST y generar un HTTP RESPONSE
Hola,

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:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.   # Create a user agent object
  2.   use LWP::UserAgent;
  3.   use strict;
  4.   use HTTP::Request::Common;
  5.  
  6.   my $ua = LWP::UserAgent->new;
  7.   $ua->agent("MyApp/0.1 ");
  8.  
  9.         #xml message
  10.         my $message = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  11.         <TollChargeExchangeMessage CreateRef=\"Info24\" MsgVer=\"2.2\" RegionalUnits=\"Metric\" TimeZone=\"UTC\">
  12.         <msgId>1bdf48c5</msgId>
  13.         <msgSender>
  14.                 <informationSenderID>2bdf48c5</informationSenderID>
  15.         </msgSender>
  16.         <msgExpiryTime>2010-04</msgExpiryTime>
  17.         </TollChargeExchangeMessage>";
  18.  
  19.   # Create a request
  20.   my $req = HTTP::Request->new(POST => 'direccion_script_perl');
  21.  # $req->content_type('application/x-www-form-urlencoded');
  22.   $req->content_type('text/xml');
  23.   $req->content($message);
  24.  
  25.   # Pass request to the user agent and get a response back
  26.   my $res = $ua->request($req);
  27.  
  28.   #Check the outcome of the response
  29.   if ($res->is_success) {
  30.       print $res->content;
  31.      
  32.   }
  33.   else {
  34.         print $res->as_string;
  35.         print $res->status_line, "\n";
  36.   }



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:


Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI       qw(:standard  -debug);
  3. use CGI::Carp qw(fatalsToBrowser);
  4. use strict;
  5. use LWP::UserAgent;
  6. use HTTP::Request::Common;
  7. use XML::TreePP;
  8. use Data::Dumper;
  9.  
  10. print
  11.    header,
  12.    start_html('PRUEBA'),
  13.    h1('PRUEBA'),
  14.    hr,
  15.    p('Welcome'),
  16.    hr;
  17.  
  18.  
  19. #######################################################################
  20. ###Comprobación del código y la contraseña############################
  21.  
  22. #!/usr/local/bin/perl -w
  23. use CGI;             # load CGI routines
  24.    
  25. my $query = CGI->new;
  26. my $senderID = $query->param('SenderID');
  27. my $login = $query->param('Login');
  28.  
  29. if($senderID != 0000 ){
  30. print p('senderID not correct');
  31. #exit(0);
  32. }
  33.  
  34. if($login != 1111 ){
  35. print p('Login not correct');
  36. #exit(0);
  37. }
  38.  
  39. #print p($senderID);
  40. #print p($login );
  41. print end_html;
  42.  
  43.  
  44.  
  45.  
  46. #########################################################################
  47. ## read XMl content######################################################
  48.  
  49. my $buffer; #inicializa contenedor
  50. my %Variables; #inicializa el hash
  51.  
  52. #Lee el Standard input
  53. my $tpp = XML::TreePP->new();
  54. read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  55. my $tree = $tpp->parse($buffer);
  56. print p($tree->{msgId});
  57.  
  58.  
  59.  
  60. ##########################################################################
  61. #########Http response####################################################
  62.  
  63. # Create a User Agent object
  64.  
  65. my $ua = new LWP::UserAgent;
  66. $ua->agent("arena/1.0");
  67.  
  68. my $response = HTTP::Response->new(200);
  69.  
  70. my $mes= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  71. <TollChargeExchangeMessage CreateRef=\"Info24\" MsgVer=\"2.2\" RegionalUnits=\"Metric\" TimeZone=\"UTC\">
  72. <msgId>1bdf48c5</msgId>
  73. <msgTimeStamp>2009-10</msgTimeStamp>
  74. <msgSender>
  75.         <informationSenderID>2bdf48c5</informationSenderID>
  76.         <informationSenderName>Name of TSP</informationSenderName>     
  77. </msgSender>
  78. <msgExpiryTime>2010-04</msgExpiryTime>
  79. </TollChargeExchangeMessage>";
  80.  
  81. $response->content($mes);



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.


Nota 2009-10-26 12:05 @545
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE
Bienvenido a los foros de Perl en Español, Damian.

Parece que estás usando el protocolo CGI para hacer el intercambio de información.

Quizás en realidad lo que quieras es usar el protocolo SOAP. Para ello, hay varios módulos al respecto, como el SOAP::Lite. En estos foros hemos hablado alguna vez sobre este tema.

Se puede simplificar un poco el trabajo para realizar el intercambio de información mediante CGI.

Con este programa creamos la petición:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use HTTP::Request::Common qw(POST);
  7. use LWP::UserAgent;
  8.  
  9. my $mensaje = q'<?xml version="1.0" encoding="UTF-8"?>
  10. <TollChargeExchangeMessage CreateRef="Info24" MsgVer="2.2" RegionalUnits="Metric" TimeZone="UTC">
  11.    <msgId>1bdf48c5</msgId>
  12.    <msgSender>
  13.        <informationSenderID>2bdf48c5</informationSenderID>
  14.    </msgSender>
  15.    <msgExpiryTime>2010-04</msgExpiryTime>
  16. </TollChargeExchangeMessage>';
  17.  
  18. my $ua = LWP::UserAgent->new;
  19.  
  20. my $req = POST 'http://correo.joaquinferrero.com/~explorer/cgi-bin/code_18887.pl',
  21.             [ mensaje => $mensaje ];
  22.  
  23. print $ua->request($req)->as_string;
  24.  
  25. __END__

No hay que destacar mucho. Se ha sacado de la página de manual de lwpcook. Simplemente creamos el mensaje y hacemos la petición POST.

Y este es el programa que lee el mensaje, extrae y muestra la información.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use CGI       ':standard';
  7. use CGI::Carp 'fatalsToBrowser';
  8.  
  9. if (my $mensaje = param('mensaje')) {
  10.  
  11.     (my $msgId) = $mensaje =~ m/<msgId>(.*?)</s;
  12.  
  13.     print
  14.         header,
  15.         start_html,
  16.         p($msgId),
  17.         end_html
  18.         ;
  19. }

Solo leemos el valor almacenado en el parámetro 'mensaje', extraemos el valor del msgId por medio de una expresión regular, y lo mostramos en un HTML sencillo.

_________________
JF^D Perl programming


Nota 2009-10-27 03:05 @170

Perlero Nuevo
Registrado: 2009-10-23 06:28 @311
Mensajes: 7
Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE
Hola.

Muchas gracias por la ayuda. Sólo una pregunta: ¿es posible devolver con el módulo CGI un HTTP RESPONSE con un mensaje XML asociado? ¿O eso sólo puedo hacerlo con el módulo SOAP?

Gracias de nuevo.

Damián


Nota 2009-10-27 03:32 @189
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE
Por defecto, head() devuelve una cabecera text/html, pero si quieres que sea un XML, basta con cambiarlo a

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.     header('text/xml'),


para que se genere esa cabecera HTTP. Y luego, inmediatamente, sacas el contenido XML.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.     "<msgid>$msgId</msgid>\n";

_________________
JF^D Perl programming


Nota 2009-10-27 04:28 @227

Perlero Nuevo
Registrado: 2009-10-23 06:28 @311
Mensajes: 7
Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE
Hola de nuevo,

O sea, que podría valer sólo con esta línea de código para devolver el mensaje XML:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
print header('text/xml'),"<msgid>$msgId</msgid>\n";


¿Lo he entendido bien?

Muchísimas gracias.


Última edición por explorer el 2009-10-27 07:02 @334, editado 1 vez en total
Ortografía


Responder al tema  [ 5 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO