como llamar a un servicio web
#1
Escrito 30 noviembre 2011 - 07:05
Tengo problemas nuevamente, me pueden explicar como asociar los datos que vienen de un servicio web a un datasource o algun otro componente de delphi, nunca habia hecho esto y no tengo idea de como hacerlo .
#2
Escrito 30 noviembre 2011 - 07:09
Saludos!
#3
Escrito 30 noviembre 2011 - 07:14
debo crear la aplicacion cliente que consulira el servicio web
#4
Escrito 30 noviembre 2011 - 08:38
Te deben dar la url del wsdl para que puedas extraer las clases y métodos, después con el WSDL Importer de Delphi, creas la unidad que te permitirá consumir el servicio web.
Puedes tomar como base el tutorial de webservice que tenemos y puedes buscar la palabra CURL donde también vas a poder encontrar otra alternativa excelente para consumir webservices.
Saludos
#5
Escrito 30 noviembre 2011 - 02:10
empty soap body with no child element not supported for rpc
#6
Escrito 30 noviembre 2011 - 02:18
Pues ese error es porque el cuerpo del SOAP no contiene elementos, puede ser que no estés llenando los campos en tu REQUEST o que el retorno del Servicio Web no regresa datos asunto que no me "cuadra".
Si puedes mostrarnos el código de como estás "llenando" la petición podriamos ayudarte mejro.
Saludos
#7
Escrito 30 noviembre 2011 - 02:28
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,DatosWSImpl, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private servicio_web : DatosWS; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var strXml: datosVOArray; begin servicio_web:=GetDatosWS(True); strXml:=servicio_web.buscarDatos;//aqui se produce el error end; end.
#8
Escrito 30 noviembre 2011 - 02:31
¿ Que tipo de dato es datosVOArray ?
Salud OS
#9
Escrito 30 noviembre 2011 - 02:38
datosVOArray = array of datosVO;
y datosVO esta implementado asi:
datosVO = class(TRemotable)
#10
Escrito 30 noviembre 2011 - 02:48
Cuando se implemento el proceso con el WSDL Importer el autoamticamente lo creo de esta forma.
datosVOArray = array of datosVO;
y datosVO esta implementado asi:
datosVO = class(TRemotable)
Muy bien, ya veo el problema, no puedes acceder al Arreglo de datos de forma lineal, mira éste hilo que te va a decir como recibir los datos de un Array of TRemotable
Salud OS
#11
Escrito 30 noviembre 2011 - 03:13
#12
Escrito 30 noviembre 2011 - 03:17
Gracias por todo Egostar ya estoy comprendiendo este tema un poco mas, revisare el hilo que me recomendaste y estare comentando como me fue
Perfecto, cualquier duda publícala y con gusto aprendemos juntos
Salud OS
#13
Escrito 01 diciembre 2011 - 07:55
Trate de seguir los pasos que me mostro Egostar en un hilo anterior pero no me resulto, no se que estoy haciendo mal al tartar de mostrar los datosme pueden dar otra ayuda.
Saludos.
#14
Escrito 01 diciembre 2011 - 08:05
#15
Escrito 01 diciembre 2011 - 08:45
Hola
Trate de seguir los pasos que me mostro Egostar en un hilo anterior pero no me resulto, no se que estoy haciendo mal al tartar de mostrar los datosme pueden dar otra ayuda.
Saludos.
Hola
Es un poco dificil ayudarte si no contamos acceso al webservice, y entiendo que no es algo que puedas publicar libremente, pero, seria bueno que nos mostraras la estructura de la clase datosVO y el código que utilizaste y que no te resultó.
Saludos
#16
Escrito 01 diciembre 2011 - 10:22
datosWS = interface(IInvokable) ['{87B6C67B-F1BC-6D05-4154-454653E76C62}'] function buscarDatosActivos: DatosVOArray; stdcall; [color=red]/*estructura del ws[/color] DatosVO = class(TRemotable) private FdesDepartamento: WideString; FdesMunicipio: WideString; Fid: Int64; public constructor Create; override; destructor Destroy; override; published property desDepartamento: WideString read FdesDepartamento write FdesDepartamento; property desMunicipio: WideString read FdesMunicipio write FdesMunicipio; property id: Int64 read Fid write Fid; [color=red]/*Procedimiento donde se llama*[/color] procedure TForm1.Button1Click(Sender: TObject); var Servicio_web:DatosWS; strXml: DatosVOArray; i: Integer; objCont: DatosVO; begin Servicio_web := GetDatosWS(True); strXml := Servicio_web.buscarDatosActivos; [color=red]// Aqui sale el error[/color] ClientDataSet1.Open; ClientDataSet1.DisableControls; for i := 0 to High(strXml)-1 do begin objCont := strXml[i] As contratoSeguroVO; ClientDataSet1.Append; ClientDataSet1.FieldByName('idContrato').AsInteger := objCont.id; ClientDataSet1.FieldByName('municipio').AsString := objCont.desMunicipio; ClientDataSet1.FieldByName('departamento').AsString := objCont.desDepartamento; ClientDataSet1.Post; end; ClientDataSet1.EnableControls; end;
#17
Escrito 01 diciembre 2011 - 10:39
#18
Escrito 01 diciembre 2011 - 10:42
Saludos
#19
Escrito 01 diciembre 2011 - 10:53
empty soap body with no child element not supported for rpc
.
Consultando en internet dice que puede ser que falte una actualizacion de delphi o algun complemento.
#20
Escrito 01 diciembre 2011 - 11:30
En datosws reemplaze la linea
//InvRegistry.RegisterInvokeOptions(TypeInfo(ContratacionWS), ioLiteral);
Por
InvRegistry.RegisterInvokeOptions(TypeInfo(ContratacionWS), ioDocument);
Funciono Bien, gracias por todo Egostar con tu ayuda pude comprender muchas cosas