FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Ayuda con Webservice
Hola foro,
Espero estén de lo mejor. Les comento que estoy iniciando con webservice en delphi y estoy fatal. Detalles: El webservice utiliza soap con wsdl y esta ejecutandose en localhost. Windows 10. Delphi 10.1. Intento llamar una función, que se genero de la importación, y que esta estructurada de la siguiente forma:
Mediante una acción en un boton, intento cargar el resultado en un memo
Sin embargo, me indica que el identificador login no esta declarado. [dcc32 Error] Unit1.pas(49): E2003 Undeclared identifier: 'login'. El unit generado de la importacion, lo incorporo en la clausula USES. Intento hacer algo similar a esto: Código:
$client=new SoapClient("http://localhost/sugarCRM/service/v4/soap.php?wsdl"); $response=$client->__soapCall("login", array("user_auth"=> array( 'user_name'=>'admin', 'password'=>md5('clave'), 'version'=>"0.1",), "application_name"=>'')); $session_id=$response->id; echo "Session ID".$session_id; Sin embargo en Delphi, no me ha funcionado. Alguien me puede orientar, sobre que puedo estar haciendo mal. Cualquier ayuda es bienvenida. Saludos. |
#2
|
||||
|
||||
Copia el código completo de las dos Unit
|
#3
|
|||
|
|||
Hola AgustinOrtu,
//al momento de enviar el unit recibo este mensaje en el foro El texto que has ingresado es muy largo (53228 caracteres). Por favor acórtalo a 30000 caracteres de largo. Lo adjuntare en dos mensajes. Gracias, ahora agrego el código. Hace un momento logre que compile sin errores, pero al generar la acción en el boton, la aplicación genera un error de "Access Violation at Address" . No se como recuperar la información. Unit principal (VCL)
|
#4
|
|||
|
|||
Este el código del unit generado, tras la importación:
Lo adjunto en un txt, ya que no permite incluirlo en un mensaje, porque sobre pasa la cantidad de caracteres. lo adjunto en el siguiente enlace de pastebin, ya que no logre subirlo al foro http://pastebin.com/gsMqgKwh Toda ayuda es bienvenida. Saludos. Última edición por gersojn fecha: 28-01-2017 a las 03:50:01. Razón: agregar codigo |
#5
|
||||
|
||||
El codigo que publicaste en el primer mensaje es distinto al ultimo:
Por otra parte, el codigo que publicaste en el segundo mensaje compila y no se da el error que comentas |
#6
|
||||
|
||||
Otra cosa importante es que no estas inicializando los objetos que estas usando
sugarsoapPortType es una interface, es decir, para poder usarla, debes primero asignar una referencia a un objeto que imlpemente esa interface a la variable. De no hacerlo, la referencia contiene el valor nil. Cualquier metodo que quieras ejecutar sobre una interface que vale nil, produce un error en tiempo de ejecucion EAccessViolation El wizard te genera automaticamente una funcion para crear esta interface, GetsugarsoapPortType Para usar la interface deberias hacer algo como esto:
Esta misma "regla", se cumple para todos los tipos involucrados. Debes inicializarlos (crearlos, ya sea con un constructor, o con una funcion) y luego utilizarlos. Es cierto que existen los llamados "tipos primitivos" (Integer, string, record, etc) que si bien no es necesario resulta importante inicializarlos para darles un valor que tenga sentido: Este codigo no da error, pero que valor tiene la variable I? No hay forma de saberlo ya que I va a tener el valor que estaba almacenado en la direccion de memoria que le fue asignado. Se dice en la jerga que el valor de I es "residuo"
Hago enfasis en esto porque del mismo modo que invocas metodos sobre una interface sin antes inicializarla, y tambien le pasas parametros que no son inicializados Por ejemplo, user_auth es una clase:
Osea que debes inicializar una variable y luego tambien darle valores a sus propiedades internas (user_name y password, sino quedan como string vacios y quiza no tenga sentido, lo ideal seria darle valores concretos) |
#7
|
|||
|
|||
Hola,
Gracias por la ayuda. Realice la siguiente modificacion sobre el procedimiento:
Al momento de invocar la función, obtengo el siguiente error: Conversion from class TForm1 to SOAP is not supported - SOAP classses must derive from TRemotable No consigo comprender la forma correcta de crear una instancia , para utilizar la función de Login. Toda ayuda, es bienvenida. Saludos. Última edición por gersojn fecha: 28-01-2017 a las 17:51:55. |
#8
|
||||
|
||||
La verdad es que nunca use SOAP. Yo primero leería la documentación
Luego una guía de un hola mundo está bien para no ir tan a tientas, por ejemplo, esta. En la primer parte crea el servidor también en Delphi, eso te lo podes saltear e ir directo a la parte del cliente |
#9
|
|||
|
|||
Usa la función que genera el importador
El importador genera una función que devuelve la interfaz a usar, por ejemplo en un importador tengo:
Yo llamo a GetpreventaPortType, y guardo la interfaz del tipo preventaPortType (este es el nombre de mi caso) en una variable, y luego la uso para acceder a los dos métodos download y upload de dicha interfaz, cuando acabas la igualas a nil y se libera. |
#10
|
|||
|
|||
Gracias a todos
Hola, gracias por la ayuda.
Ya tengo un mes y esto no me funciona para nada. He estado practicando algo sobre WS en Delphi, tanto creando clientes y servidores y todo va perfecto. Pero, en cuanto a el ws antes mencionado siento muy complejo abordarlo desde Delphi. Continué el desarrollo en Php. Saludos. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Consumir Webservice | darkerbyte | Delphi para la web | 5 | 17-11-2012 20:59:50 |
webservice WCF | consultasmq | Internet | 0 | 19-03-2012 21:10:00 |
Consumir WebService. Ayuda con XML,WSDL,XSD,SOAP | josemmerida | Internet | 2 | 23-12-2010 13:37:16 |
WebService y D4 | Nose | Internet | 1 | 02-08-2005 22:18:23 |
|