Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Aplicacion Rest Como hacerla (https://www.clubdelphi.com/foros/showthread.php?t=91574)

ASAPLTDA 07-03-2017 15:59:49

Aplicacion Rest Como hacerla
 
Buenos dias Foristas. He iniciado a mirar como se hace una aplicacion que utilice rest server y rest cliente.
El ejemplo que encontre fue la que hace delphi con su plantilla de echo y cambiar de orden el valor de una cadena. Ejemplo interesante para observar como funciona.

Pero en el mundo de apliaciones este ejemplo es poco util, ya que normalmente las aplicaciones reciben datos y retornan resultados de una base de datos.
Quisiera sabe si alguien tiene la url de un ejemplo donde existe por ejemplo enviar datos al servidor , verificar si los recibió la informacion, o solicitar un clientdataset para desplegarlo en en el cliente.
Este ejemplo serviria a todos para iniciar sus propios programas

Agradezco la ayuda que puedan brindar al foro

Casimiro Notevi 07-03-2017 16:43:16

Mira la web de neftali, creo que ahí encontrarás lo que buscas.

AgustinOrtu 07-03-2017 16:47:08

Hay bastante informacion en la documentacion y ejemplos

Este por ejemplo muestra como exponer un DataSet

Aca discutimos otra forma de hacerlo

Tambien podes usar frameworks de terceros como MARS o mORMot

jhonny 07-03-2017 17:14:11

Yo es que devuelvo siempre un TObjectList con los objetos previamente mapeados por medio de un ORM que yo mismo hice. En fin, toda una forma de programar este tipo de cosas.

mamcx 07-03-2017 18:49:52

Una aplicación REST no es tan diferente de una app normal, solo que agrega una forma diferente de serializacion & esta distribuida.

Como se explica en la tesis de como hacer apps robustas de forma distribuida:
(Del creador de ERLANG, un lenguaje donde las funciones locales se manejan tal como las remotas).
http://erlang.org/download/armstrong_thesis_2003.pdf

-----

Una app distribuida "simple" es casi lineal:

Cita:

Cliente -> COMANDO -> Serializador -> RED -> Servidor -> Deserializador -> Ruteo -> COMANDO EN SERVIDOR -> RESPUESTA (y se invierte los pasos)
Todo entre Serializador y Ruteo son las cosas que se agregan al proceso.

Osea que hacer:

Código Delphi [-]
procedure sum(a,b:Integer):Integer

sum(a,b)

En ambos casos es "casi lo mismo".

SIN EMBARGO

El *verdadero shock* está en que en una app monolítica tienes un manejo invisible del "estado" del programa, y mutas libremente el contenido de la memoria. Ese manejo de estado es lo que te da el runtime/lenguaje. Por ejemplo, al hacer la llamada a SUM no tienes que conocer la dirección en memoria, y aun toda una INVISIBLE cantidad de "variable globales" como el STACK y el HEAP que mantienen todo vivo. Una ficción que se rompe de cuando en cuando al manifestarse en forma de bugs.

Esa ficcion no sirve en una app distribuida. Y como la mayoría de los lenguajes tienen un acceso global del programa, aun los programadores más cuidadosos tienen todo entrelazado por mas que intenten aislar o encapsular las cosas. Y cuando tratan de portar eso a una app distribuida se estrellan porque toda su intuición queda derrumbada, aunque juren que han sido programadores disciplinados.

Además, mientras en un monolito solo hay un "cliente", en una app distribuida hay que asumir no solo una posibilidad infinita, sino que los clientes pueden ser maliciosos.

Asi que tienes que:

1- Asumir que todo lo que llega al servidor puede venir de un cliente malicioso. Todo hay que validarlo.
2-Manejar de forma manual el estado, haciendo lo posible de no usarlo ("stateless").
3-Buscar hacer funciones "puras", al estilo de lenguajes funcionales, que no accedan nada "global" ni generen "side-effects"
4-Reducir al mínimo la cantidad de datos en la comunicación
5-Asumir que los clientes/servidores morirán a mitad, al principio, al final, llegando, dandose la vuelta, en todo momento.

ASAPLTDA 08-03-2017 15:41:10

Aplicacion Rest
 
Gracias a todos por sus respuestas.
VEo que falta mucho por aprender.

Me gustaría recibir ampliaciones sobre el tema y que todos los floristas aprendamos sobre esta tecnología por ejemplo
1. cuando uno hace en delphi el servidor rest y el cliente es un programa hecho en otro lenguaje se hace de forma diferente
1.1 para exponer una función que existe en el servidor rest , que información debe proveer el servidor para que un cliente externo use la funcion ?

jhonny 08-03-2017 19:02:16

Cita:

Empezado por ASAPLTDA (Mensaje 514122)
Gracias a todos por sus respuestas.
VEo que falta mucho por aprender.

Me gustaría recibir ampliaciones sobre el tema y que todos los floristas aprendamos sobre esta tecnología por ejemplo
1. cuando uno hace en delphi el servidor rest y el cliente es un programa hecho en otro lenguaje se hace de forma diferente
1.1 para exponer una función que existe en el servidor rest , que información debe proveer el servidor para que un cliente externo use la funcion ?

1. Así el cliente esté creado también en Delphi, debes hacer el server, como si estuvieras desarrollando para un cliente hecho en otro Lenguaje. Para mí, esa es una de las claves de éxito importantes para llevar a cabo una solución así.
1.1 Debes entregarle la documentación y ejemplos necesarios con el esquema JSON con el que se enfrentarán.

mamcx 08-03-2017 20:35:53

Cita:

Empezado por ASAPLTDA (Mensaje 514122)
1. cuando uno hace en delphi el servidor rest y el cliente es un programa hecho en otro lenguaje se hace de forma diferente

Cada lenguaje tiene sus propios idomas y formas de resolver las cosas, pero en el caso de REST es mas un protocolo, asi que al final la estructura general es la misma. Recuerda que se usa HTTP(o similar) y un metodo de paso de datos como Json/ProtocolBuffers/CVS/etc que es agnostico al lenguaje.

Cita:

Empezado por ASAPLTDA (Mensaje 514122)
1.1 para exponer una función que existe en el servidor rest , que información debe proveer el servidor para que un cliente externo use la funcion ?

Si es algo interno nada, pero si quieres publicar una API pues debes hacer la documentacion adecuda.

Es popular por ejemplo, usar:

http://swagger.io/

----
La parte que reitero, ya que algunos piensas que REST es "usar json", es solamente la implementacion de los "VERBOS" http y de los URI. Se pueden pasar cualquier dato (incluyendo binarios) aunque es popular hoy usar Json, pero si hay razones para usar algo mas no hay que limitarse.

Por ejemplo, en mi caso yo paso tambien bases de datos sqlite (todo el archivo) y asi me ahorro un monton de trabajo, aparte que puedo hacer consultas sql identicas entre cliente y servidor.

Y usando la habilidad para abrir una BD sqlite dentro de otra, paso datos sin la sobrecarga de serializar/desearilizar, puedo usar transacciones y demas, Por ejemplo, en una app esto es parte de la sincronizacion (en Swift/ios junto a un servidor python):

Código PHP:

func downloadData(_ removeAbono:Boolthrows {
    
Log.info("Downloading data...")
    
    
let con openDb()
    
    try 
con.inDatabase db1 in
        
try db1.execute("ATTACH DATABASE '\(syncpath)' AS 'sync'")
    }
    
    
defer {
        
con.inDatabase db1 in try! db1.execute("DETACH sync")}
    }
    
    try 
con.inTransaction db in
        
        
try db.execute("DELETE FROM cliente WHERE version = 0")
        
        try 
db.execute("DELETE FROM Config")
        try 
db.execute("INSERT OR REPLACE INTO Config ( id, nombre, tipo, valor) SELECT id, nombre, tipo, valor FROM sync.Config")
        
        try 
db.execute("INSERT OR REPLACE INTO cliente ( cobro_id, codigo, direccion, fechaIngreso, id, nombre, orden, telefono, version, localid)  SELECT cobro_id, codigo, direccion, fechaIngreso, id, nombre, orden, telefono, version, localid FROM sync.cliente")                
        return .
commit
    
}


Cientos de lineas de codigo ahorrada ;)

Osea, REST puede ser un ideal, pero no hay que ignorar las posibilidades...


La franja horaria es GMT +2. Ahora son las 00:04:53.

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