• Publicidad

Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Notapor Damian » 2009-10-26 05:06 @254

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:

Sintáxis: [ Descargar ] [ Ocultar ]
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.   }
Coloreado en 0.004 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:


Sintáxis: [ Descargar ] [ Ocultar ]
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);
Coloreado en 0.003 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.
Damian
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-10-23 06:28 @311

Publicidad

Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Notapor explorer » 2009-10-26 12:05 @545

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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.

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Notapor Damian » 2009-10-27 03:05 @170

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
Damian
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-10-23 06:28 @311

Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Notapor explorer » 2009-10-27 03:32 @189

Por defecto, head() devuelve una cabecera text/html, pero si quieres que sea un XML, basta con cambiarlo a

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     header('text/xml'),
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     "<msgid>$msgId</msgid>\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recibir un XML con HTTP POST y generar un HTTP RESPONSE

Notapor Damian » 2009-10-27 04:28 @227

Hola de nuevo,

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print header('text/xml'),"<msgid>$msgId</msgid>\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Lo he entendido bien?

Muchísimas gracias.
Última edición por explorer el 2009-10-27 07:02 @334, editado 1 vez en total
Razón: Ortografía
Damian
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2009-10-23 06:28 @311


Volver a Web

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados