PDA

Ver la Versión Completa : Consumir un Web Service


lbidi
16-04-2012, 21:10:32
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.



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
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í.


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