Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consumir un Web Service (https://www.clubdelphi.com/foros/showthread.php?t=78403)

lbidi 16-04-2012 21:10:32

Consumir un Web Service
 
Estimados.

Necesito enviar cierta informacion a un web service de otro sistema desarrollado por otra gente.
Me dieron el archivo wsdl el cual he logrado importar con el wizard y me ha la creado unidad correspondiente.

Aparentemente es muy sencillo, tiene solo una funcion para recibir los datos que yo le debo
enviar. He logrado que compile pero no estoy seguro si el archivo estaba bien o si la unidad
que genero esta bien, porque no he podido acceder a su funcion desde otra unidad de mi sistema.

He leido el post de egostar sobre Web services , pero aun asi no he podido hacer que funcionara.

Les dejo el codigo de la unidad que genero el wizard a ver si alguien puede decirme si lo genero
bien o como debo llamar desde mis otras unidades a la funcion que aqui se hace presente.

Código Delphi [-]

unit u_webService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_UNBD = $0002;
  IS_NLBL = $0004;
  IS_UNQL = $0008;
  IS_ATTR = $0010;
  IS_TEXT = $0020;

type

  resultado = interface(IInvokable)
  ['{E215B04D-08B9-A9EF-456D-7550D58C4D38}']

// esta es la funcion que debo utililzar
    function  altaresult(const ErNumLin: Int64; const ResuNumLin: Integer; const ResuDsc: WideString;    const ResuUni: WideString; const ResuVRef: WideString; const ResuVHallado: WideString;
                         const ResuObs: WideString): Integer; stdcall;

  end;

function Getresult(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): resultado;

implementation
  uses SysUtils;

function Getresult(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): resultado;
const
  defWSDL = 'C:\result.wsdl';
  defURL  = 'http://10.5.1.1:8080/WebServiceEstu/services/result';
  defSvc  = 'resultService';
  defPrt  = 'result';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as resultado);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service      := defSvc;
      RIO.Port         := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(resultado), 'http://logica', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(resultado), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(resultado), ioDocument);

end.

Se supone que debo utilizar esa funcion y pasarle parametros que el "bendito" web service esta
esperando. Ademas no lo puedo probar, ya que la ip en la cual escucha, esta en mi cliente,
y no se puede acceder desde el exterior.

Se agradece eternamente cualquier ayuda y/o sugerencia.

Saludos.

egostar 16-04-2012 21:25:57

Hola

Pues lo primero que debes tener es acceso a la IP de tu cliente, de otra forma no se puede hacer nada.

Saludos

lbidi 16-04-2012 21:44:30

Gracias egostar.

Eso por supuesto que lo tengo claro, pero en realidad no busco "probarlo" en mi pc de desarrollo,
sino tratar de hacer el codigo necesario y luego llevarlo al cliente.

Como mencionaba en el post, no he logrado acceder a la funcion "altaresult" desde otras
unidades de mi sistema.

Alguna idea porque ?

Mil gracias.

egostar 16-04-2012 21:58:24

Cita:

Empezado por lbidi (Mensaje 430147)
Gracias egostar.

Eso por supuesto que lo tengo claro, pero en realidad no busco "probarlo" en mi pc de desarrollo,
sino tratar de hacer el codigo necesario y luego llevarlo al cliente.

Como mencionaba en el post, no he logrado acceder a la funcion "altaresult" desde otras
unidades de mi sistema.

Alguna idea porque ?

Mil gracias.

Entiendo, yo haría algo así.

Código Delphi [-]
uses
   u_webService

procedure TForm1.Button1Click(Sender: TObject);
var
  wsResultado: resultado;
  Retorno: integer;
  
begin  
  wsResultado := Getresult(false,'',nil);
  Retorno := wsResultado.alteresult('***parametros***'); //Agregas todos los parámetros que te pide.
  
  if Retorno <> nil then
     showMessage(format('El resultado del método alteresult es %d',[Retorno]));
end;

Saludos

lbidi 17-04-2012 14:28:37

Mil gracias, egostar.

Realmente ahora me di cuenta como funciona.

Saludos desde Uruguay


La franja horaria es GMT +2. Ahora son las 08:30:35.

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