Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   webservice con Sesion (https://www.clubdelphi.com/foros/showthread.php?t=72612)

comba 01-03-2011 20:04:40

webservice con Sesion
 
Hola estoy utilizando delphi2007 y tengo que consumir 2 webservices.
Hasta hay no hay problema.

El 1º no hay problema ya que conecta perfectamente. Paso unos parametros y este me devuelve otros.

El 2º es donde viene el problema ya que para utilizarlo tengo que utilizar una variable del 1º que es la sesion.
Pero cuando voy a consumir el 2º webservices no tengo una variable session me dicen que tengo que utilizar esta clase

ROClientIDHeader = class(TSOAPHeader)
private
FID: WideString;
FID_Specified: boolean;
procedure SetID(Index: Integer; const AWideString: WideString);
function ID_Specified(Index: Integer): boolean;
published
property ID: WideString Index (IS_OPTN) read FID write SetID stored ID_Specified;
end;

También me dicen que construya el webservice y que pase la sesion a la propiedad id.

La verdad es que hay es donde me pierdo.
Alguien me pueda orientar un poquito.

Muchas gracias.:)

Ñuño Martínez 02-03-2011 12:14:20

El tema de las sesiones es complicado. ¿Están los dos servicios en el mismo dominio? Porque normalmente las sesiones se asocian a un único dominio para evitar suplantaciones.

comba 02-03-2011 16:18:26

Efectivamente los 2 estan en el mismo dominio.

Ñuño Martínez 03-03-2011 10:02:37

Disculpa si peco de condescendiente pero, sabes lo que es una "sesión", ¿verdad? Lo digo porque acabo de releer tu primer mensaje y la sentencia "que construya el webservice y que pase la sesión a la propiedad id" no tiene mucha sentido para mi.

En web se trabaja por peticiones, es decir, un cliente hace una petición y el servidor responde a dicha petición. En principio el servidor maneja cada petición de forma independiente; los datos generados en una petición no están disponibles en la siguiente. En ocasiones es conveniente que algunos datos "permanezcan" entre petición y petición, y ahí entran las sesiones.

Si la sesión es gestionada por el servidor, primero el cliente pide al servidor un identificador de sesión, entonces el servidor crea una "sesión persistente", la identifica y devuelve el identificador. A partir de ese momento el cliente incluye ese identificador en las peticiones de forma que el servidor "sepa" que puede/debe utilizar los datos de dicha sesión.

Hay sesiones que son gestionadas por el cliente, en cuyo caso los datos se almacenan en el lado cliente, por ejemplo usando huellas (cookies). Ahora el cliente debe incluir toda la información almacenada en la sesión en cada petición.

Normalmente las sesiones no sólo llevan asociadas un identificador sino también la dirección IP del cliente y una caducidad. De esta forma han de coincidir ambos valores (identificador e IP) para poder acceder a la misma. Y también, si durante un tiempo no se hace ninguna petición la sesión se destruye.

Nunca he usado SOAP, pero por lo poco que sé lleva implícito la gestión de sesiones. Supongo que a lo que se refiere con la frase que he citado al principio es que obtengas el identificador de la sesión SOAP del primer servicio y se la pases al segundo servicio, pero no tengo nada claro que esto sirva de algo puesto que cada servicio usará su propio espacio de trabajo. Lo más probable es que debas crear tu propio sistema de sesiones (con la información que te he dado no debería costarte mucho imaginar cómo hacerlo).

Quim Herrera 11-12-2020 10:13:29

Tengo el mismo problema al consumir un webservice de una empresa de transportes. Llamas al primer webservice para identificarte y te devuelve un id que debes mandar al segundo website dentro del <header> junto con los datos para dar de alta el envio.
He importado los wsdl con delphi tokyo y la cabecera está allí:
Código Delphi [-]
  ROClientIDHeader     = class;  
  .....
  
  // ************************************************************************ //
  // XML       : ROClientIDHeader, global, 
  // Namespace : http://tempuri.org/
  // Info      : Header
  // ************************************************************************ //
  ROClientIDHeader = class(TSOAPHeader)
  private
    FID: string;
    FID_Specified: boolean;
    procedure SetID(Index: Integer; const Astring: string);
    function  ID_Specified(Index: Integer): boolean;
  published
    property ID: string  Index (IS_OPTN) read FID write SetID stored ID_Specified;
  end;
  .....
  
  
procedure ROClientIDHeader.SetID(Index: Integer; const Astring: string);
begin
  FID := Astring;
  FID_Specified := True;
end;

function ROClientIDHeader.ID_Specified(Index: Integer): boolean;
begin
  Result := FID_Specified;
end;

...
  InvRegistry.RegisterHeaderClass(TypeInfo(WebServService), ROClientIDHeader, 'ROClientID', 'http://tempuri.org/');

Pero no sé como incluirla en el xml al hacer el envio.

Se está enviando:

Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <SOAP-ENV:Body>
                <WebServService___GrabaEnvio19 xmlns="http://tempuri.org/">
                        <strCodAgeCargo>099999</strCodAgeCargo>
                        <strCodAgeOri>099999</strCodAgeOri>
        ...
                        <strCodPuntoConveniencia/>
                </WebServService___GrabaEnvio19>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

y deberia enviarlo con la cabecera:

Código:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Header>
                <ROClientIDHeader xmlns="http://tempuri.org/">
                        <ID>{--idSesion--}</ID>
                </ROClientIDHeader>
        </soap:Header>
        <SOAP-ENV:Body>
                <WebServService___GrabaEnvio19 xmlns="http://tempuri.org/">
                        <strCodAgeCargo>099999</strCodAgeCargo>
                        <strCodAgeOri>099999</strCodAgeOri>
        ...
                        <strCodPuntoConveniencia/>
                </WebServService___GrabaEnvio19>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

¿ Alguien puede ayudarme a incluir la cabecera en el XML ?

Muchas gracias

Casimiro Notevi 11-12-2020 11:09:56

Deberías crear un hilo nuevo, y pon un título descriptivo.
Aquí sólo van a ver tu pregunta quienes han participado en este hilo.

Quim Herrera 11-12-2020 12:04:18

Hola Casimiro,
Ya he creado el nuevo.
Gracias


La franja horaria es GMT +2. Ahora son las 06:23:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi