• Publicidad

Agregar un dato al Header en un WebService

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Agregar un dato al Header en un WebService

Notapor audax » 2017-07-03 09:40 @444

Saludos a todos.

Necesito una ayuda. Resulta que estoy creando un script que consume un servicio web (WS). Pero el tema es que tengo que pasarle un valor, que lo llamaremos "token". Este token me ayuda para poder identificarme en el WS y así poder hacer la consulta. Este es el código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $clienteConsulta = SOAP::Lite-> service('https://ws2.cl/consultaservice?wsdl');
  2.                 $clienteConsulta->soapversion('1.1');
  3.                 $clienteConsulta->consultar($numero);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Respuesta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1.          <faultcode>S:Client</faultcode>
  2.          <faultstring>Error de Autenticacion: TOKEN invalido</faultstring>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El tema es que no sé cómo agregar ese "token", ya que no es un dato que pida el método "consultar". Me dijeron que ese token tengo que agregarlo al Header, pero he intentado de varias maneras y no logro agregarlo. Además me indicaron que en .Net quedaría de esta forma
Sintáxis: [ Descargar ] [ Ocultar ]
Using javascript Syntax Highlighting
  1. req.Headers.Add("SOAPAction", SOAPAction);
  2. req.Headers.Add("cookie", Token);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La idea no es hacerlo en .Net sino en Perl.

Bueno, quizás es una tontera lo que estoy pidiendo, pero le he dado varias vueltas y no encuentro la solución.

Muchas gracias por todo.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Publicidad

Re: Agregar un dato al Header en un WebService

Notapor explorer » 2017-07-03 13:23 @599

Necesitaríamos algo más de información.

En este hilo, en este mensaje, hay un ejemplo de cómo acceder a la información de actividad (algún archivo de registro log).

En cuanto a añadir algo a la cabecera, mira este ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use SOAP::Lite +trace;
  2.  
  3. $uri = 'urn:Foo';
  4. $proxy = 'http://localhost/';
  5. $username = 'username';
  6. $password = 'password';
  7.  
  8. my $client = SOAP::Lite
  9.         ->readable(1)
  10.         ->uri($uri)
  11.         ->proxy($proxy);
  12.  
  13. $client->autotype(0);
  14.  
  15. my $Username = SOAP::Header->name('Username' => $username);
  16. my $Password = SOAP::Header->name('Password' => $password);
  17.          
  18. my $UsernameToken = SOAP::Header->name('UsernameToken')
  19.             ->value(\SOAP::Header->value($Username, $Password));
  20. my $security = SOAP::Header->name('Security')
  21.             ->attr({'xmlns' => 'http://schemas.xmlsoap.org/ws/2002/xx/secext'})
  22.             ->value(\$UsernameToken);
  23.  
  24. $elem1 = SOAP::Data->name('ELEM1' => "value1");
  25. $elem2 = SOAP::Data->name('ELEM2' => "value2");
  26. $response = $client->mymethod($elem1,$elem2, $security);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

que lo he sacado de este hilo.

Tienes otro ejemplo en este hilo. Observa que para añadir una cabecera, debemos indicar en qué posición del XML se va a agregar la entrada. Quiero decir que llamar a SOAP::Header crea una entrada en el XML de la petición.
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: Agregar un dato al Header en un WebService

Notapor audax » 2017-07-03 14:50 @659

Gracias por la respuesta, me diste harto material para estudiar. Te informo cuando lo resuelvo o tenga más dudas. Gracias nuevamente.

Saludos.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Agregar un dato al Header en un WebService

Notapor audax » 2017-07-03 16:06 @712

Aún no puedo encontrar la solución pero tengo más información.

Lo que necesito es agregar una línea a la cabeza, no dentro del XML (¿me explico?). O sea, tengo esta cabecera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
SOAP::Transport::HTTP::Client::send_receive: POST https://ws2.cl/consultaservice HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 1081
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Necesito agregar la línea, por ejemplo,
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
cookie: TOKEN=$token
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

La forma que aparece es usar UserAgent, ahí puedo editar y agregar las líneas que quiera. Pero la idea es usar SOAP::Lite para conectarme al servicio web y con eso no encuentro la forma de hacerlo.

Gracias.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Agregar un dato al Header en un WebService

Notapor explorer » 2017-07-04 07:03 @335

Vale, entendido.

En la página de manual de SOAP::Lite, dentro de la explicación del método proxy() hay un ejemplo de cómo usar los métodos de LWP::UserAgent() con el objeto SOAP::Lite.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $soap = SOAP::Lite
  2.    ->uri('http://www.example.org/webservice')
  3.    ->default_header(cookie => "TOKEN=$token")
  4. ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Como ves, estamos usando los métodos de LWP::UserAgent de forma directa, para modificar la forma de hacer la petición.

Mira el ejemplo "Using cookies" en el cookbook de SOAP::Lite si quieres usar la galleta que el servidor te ha dado antes, almacenándola en la jarra de galletas.
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: Agregar un dato al Header en un WebService

Notapor audax » 2017-07-05 12:27 @560

Gracias por tu ayuda y esfuerzo, explorer, pero, la verdad, aún sigo muy confundido.

He leído harto y lo que he comprendido, es que por lo visto hay dos formas de conectarse a un servicio web (WS). Esto es del método "service" (que es el que ocupo para WS WDSL) y por el método proxy. Intentando por todos lados con proxy no logro conectarme al WS. Este es código con el WS real:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                
  2. my $cookies = 'TOKEN='.$token;
  3. my $client1 = SOAP::Lite
  4.                        ->uri('http://ws.registroreclamodte.diii.sdi.sii.cl')
  5.                        ->proxy('https://ws2.sii.cl/WSREGISTRORECLAMODTECERT/registroreclamodteservice?wsdl')
  6.                        ->default_header('cookie',$cookies);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

La respuesta es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 500 Error
  2. Connection: close
  3. Content-Type: text/xml; charset=utf-8
  4. Client-Date: Wed, 05 Jul 2017 17:13:55 GMT
  5. Client-Peer: 200.10.251.94:443
  6. Client-Response-Num: 1
  7. Client-SSL-Cert-Issuer: /C=US/CN=Symantec Class 3 Secure Server CA - G4
  8. Client-SSL-Cipher: AES128-GCM-SHA256
  9. Client-SSL-Socket-Class: IO::Socket::SSL
  10. Client-SSL-Warning: Peer certificate not verified
  11. X-Backside-Transport: FAIL FAIL
  12.  
  13. <?xml version='1.0' ?>
  14. <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
  15. <env:Body>
  16. <env:Fault>
  17. <faultcode>env:Client</faultcode>
  18. <faultstring>Internal Error</faultstring>
  19. </env:Fault>
  20. </env:Body>
  21. </env:Envelope>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Contra el método "service" que sí logro conectarme pero no me sirve el método "default_header".

Respuesta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Unrecognized method 'default_header'. List of available method(s): consultarFechaRecepcionSii listarEventosHistDoc getVersion consultarDocDteCedible ingresarAceptacionReclamoDoc
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

No sirve usar el service y proxy al mismo tiempo porque Perl se queda con service.

Como verás estoy muy enredado con este tema. Perdón de ante mano por todas las molestias. Gracias.
audax
Perlero nuevo
Perlero nuevo
 
Mensajes: 56
Registrado: 2013-06-03 13:16 @594

Re: Agregar un dato al Header en un WebService

Notapor explorer » 2017-07-06 13:33 @606

El error que sale demuestra que SOAP::Lite ha intentado llamar a un método remoto llamado default_header(), en lugar de aplicarlo al objeto SOAP::Lite, para modificar la cabecera y agregar el token.

Creo que no te he di una buena solución, en el mensaje anterior.

Según el manual de SOAP::Lite, en proxy, los parámetros adicionales para el transporte deben indicarse dentro de proxy(), no después.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $client1 = SOAP::Lite
  2.         ->uri('http://ws.registroreclamodte.diii.sdi.sii.cl')
  3.         ->proxy(
  4.                 'https://ws2.sii.cl/WSREGISTRORECLAMODTECERT/registroreclamodteservice?wsdl',
  5.                 default_headers => HTTP::Headers->new( cookie => $cookies ),
  6.         )
  7.         ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto es lo primero que debes comprobar: que la cabecera se ha modificado colocando bien la entrada cookie.

Un detalle... Ya que te conectas a un servidor .Net, ¿has comprobado todos los puntos específicos de esa plataforma?
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


Volver a Básico

¿Quién está conectado?

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