(1/5) Aplicación de acceso a datos (Introducción)
Esta entrada y las siguientes, como otras del blog, viene «provocada» por una inquietud o un problema con el que me he encontrado. A raíz de eso y de la necesidad de solventarlo ha surgido esta solución; Seguramente no es la única, y me gustaría que me propusierais otras diferentes (sobre el mismo escenario) si las tenéis. Espero esta que os propongo sea útil a otros programadores en situaciones similares.
Mi intención es dividir todo el proceso (por lo extenso) en varias entradas sucesivas. Os adjunto el «Roadmap» (que suena como muy serio ;-D ) del proceso completo y a medida que vaya completando los pasos, iré actualizando los links en todas ellas.
Contenido
“ROADMAP” DE LAS ENTRADAS
- (1/5) Introducción al problema y solución propuesta.
- (2/5) Generación del Webservice en PHP.
- (3/5) Generación de un cliente de Escritorio en Delphi.
- (4/5) Generación del cliente iOS/Android (código compartido)
- (5/5) Publicación en AppStore (Google Play) paso a paso.
EL PROBLEMA:
Un cliente nos platea la necesidad de realizar un programa que cumpla con los siguientes requisitos, a nivel muy genérico.
-
El programa debe trabajar con un acceso a Base de Datos; Por ejemplo, podemos pensar en una agenda sencilla de trabajadores –Nombre, apellidos, teléfono interno, móvil, extensión interna, email, departamento,…
-
El programa debe funcionar desde varios centros/oficinas que tiene la Empresa (sucursales diferentes en localización geográfica diferente) con una Base de Datos común.
-
Los diferentes centros no están conectados mediante red interna o VPN, aunque todos ellos están conectados a Internet.
-
Los centros no disponen de servidores propios con acceso desde el exterior (Internet).
-
Adicionalmente, además de acceder desde los puestos de trabajo de las empresas, la Base de Datos se tiene que poder acceder desde dispositivos móviles mediante una aplicación con funcionalidades reducidas. Por ejemplo, los móviles de los comerciales, cuando están trabajando fuera de las oficinas.
La idea es intentar satisfacer las necesidades del cliente, utilizando dentro de lo posible las herramientas que conocemos, en mi caso Delphi y sin tener recursos ilimitados.
BUSCANDO SOLUCIONES…
BASE DE DATOS:
Lo primero que me planteo es dónde va a estar ubicada la Base de Datos. Está claro que los datos deben ser accesibles desde cualquier lugar a través de Internet (no red local), así que las únicas opciones que se me ocurren son:
- Servidor de Base de Datos en la Empresa (en uno de los centros) con acceso desde el exterior.
- Utilizar un Servidor en Internet. Disponemos en este caso de Servidores Windows/GNU Linux.
Dado que la primera opción parece costosa y no dispongo de ese hardware actualmente en la empresa, la opción (2) parece la más aceptable. En ese caso los servidores GNU Linux son los más extendidos y económicos, así que optaré también por esa opción. Como Base de Datos usaré MySQL que es fácil de Instalar en todos los servidores (pensando en desarrollo y en futuros cambios) y es también una de las más extendidas en el escenario que he seleccionado.
APLICACIÓN CLIENTE:
Tal y como nos plantean los requisitos, la parte «cliente» de la aplicación puede ser de múltiples tipos (heterogénea). En este punto Delphi puede ayudarnos bastante, ya que con las versiones nuevas podemos compartir código entre aplicaciones de escritorio y aplicaciones móviles. Nos faltaría poder desarrollar aplicaciones web y ahí tendríamos que utilizar herramientas como HTML5 Builder.
Llegados a este punto, tengo un esquema como este:
Si la Base de Datos se encuentra en un servidor de internet, normalmente no podremos acceder directamente a ella, pues los puertos no están abiertos por defecto, y por temas de seguridad no es habitual que se haga; La forma de acceder a la Base de Datos es haciéndolo desde el mismo servidor, de forma local. Así que para completar la estructura de nuestra aplicación necesitamos una «pieza» que nos haga este trabajo.
Como programador Delphi, si la máquina que vamos a utilizar como servidor fuera una «máquina Windows», no tendría más que generar un Servidor DataSnap que atendiera a mis peticiones, pero trabajando sobre el escenario en el que voy a usar un «Servidor GNU Linux», parece que nuestra solución para por crear un Servicio web.
Si el caso fuera utilizar un servidor Windows, os dejo un par de tutoriales de Egostar, donde está explicado paso a paso todo el proceso:
SERVIDOR WEB:
Para crear el Servidor web voy a utilizar PHP. Vamos a ver cómo es bastante sencillo crear uno aunque nuestros conocimientos de PHP sean muy básicos (como es mi caso). No se necesita mucho código y para un programador es bastante sencillo e intuitivo, la estructura y el funcionamiento. Hay paquetes y librerías PHP que nos pueden facilitar el trabajo, aunque veremos que para crear un Servicio básico no las necesitamos. A partir de aquí podemos ampliarlo con nuevos métodos y más funcionalidades.
Una vez decidida cual va a ser la estructura de nuestro proyecto, vamos a comenzar por crear la parte del Servidor Web. Los veremos paso a paso en la siguiente entrada:
(2/5) Generación del Webservice en PHP.
Como siempre cualquier sugerencia, comentario, crítica,… será bienvenido.
Embarcadero MVP.
Analista y Programador de Sistemas Informáticos.
Estudios de Informática (Ingeniería Técnica Superior) en la UPC (Universidad Politécnica de Barcelona).
Llevo utilizando Delphi desde su versión 3. Especialista en diseño de componentes, Bases de Datos, Frameworks de Persistencia, Integración Continua, Desarrollo móvil,…
Me parece una serie de artículos muy interesante estimado Germán aunque tal vez un poco opacados por los turoriales que desarrollé y que amablemente has enlazado, ya son muy viejos y con la poca experiencia que tenía en ese momento, ya los veo muy básicos :D.
Prometo hacer algo más actual y corresponder con tu esfuerzo en éstos artículos :).
Saludos.
Muy interesante.
Me gustaría hacer una puntualización:
En la frase «En ese caso los servidores Unix son los más extendidos y económicos, así que optaré también por esa opción. »
Deberías cambiar Unix por Linux, ya que son Linux. Uno de los motivos principales por los que Torvalds creó Linux fue precisamente porque Unix es muy caro, actualmente pertenece a Novell. Así que creó Linux para ofrecer «un Unix» libre y económico.
Saludos
@Eliseo GN
En absoluto Eliseo, no creo que queden «viejos». Estos mismos días los he recomendado, ya que siguen siendo perfectamente válidos. Fíjate que en estas entradas, en los clientes Delphi, he usado tanto Delphi 6 como Delphi XE5, porque me consta que muchos programadores todavía usan versiones antiguas además de la nuevas.
Es más, salvo componentes nuevos, los códigos de las nuevas versiones siguen funcionando en las antiguas.
@casimiro
Muchas gracias Casimiro por la puntualización.
Ya está modificado.
Un saludo.
Muy buenos artículos, agradecer tu dedicación y esfuerzo.
Para ponerle un poco de pelos a la sopa te escribo algunos puntos a tener en consideración:
Fuente: https://www.debian.org/intro/about
1: «Linux es una pieza de software creada en un principio por Linus Torvalds y desarrollada por miles de programadores a lo largo del mundo».
2: «Las distribuciones Linux usan el nuclueo Linux.»
3: «Una gran parte de las herramientas básicas que completan el sistema operativo, vienen del proyecto GNU; de ahí los nombres: GNU/Linux»
Debido a lo anterior creo que debería ser :
«2. Utilizar un Servidor en Internet. Disponemos en este caso de Servidores Windows/GNU Linux.»
Saludos cordiales
@CLoayza
Muchas gracias por el apunte CLoayza.
Corregido.
Un saludo.
Hola, muy buen ejemplo, me ha servido de mucho pero tengo una consulta, usando tu ejemplo he intantado enviar el mismo array al servidor para agregar usuarios, al hacerlo, me devuelve «Received content of invalid Content-Type setting: text/html – SOAP expects text/xml».
Cual puede ser el problema? como esta registrada la funcion de php? al enviar el array desde delphi hay q prepararlo de alguna manera especial o algo? muchas gracias!
@iAldito
Los fuentes de los ficheros PHP los tienes en el artículo. Seguramente tendrás que modificar los parámetros de la función PHP correspondiente para que admita un array de valores.
Si cambias los datos que se envían es normal que te de error. Al llegar al servidor algo distinto a lo esperado.
Un saludo.
@Germán Estévez
si lo he cambiado, por ejemplo en el servidor php tengo:
function AddArray($users = array()) {
$fields = $values = array();
foreach( array_keys($users) as $key ) {
$fields[] = «‘$key'»;
$values[] = «‘» . mysql_real_escape_string($data[$key]) . «‘»;
}
$fields = implode(«,», $fields);
$values = implode(«,», $values);
$conn = dbConnect();
$sql = «INSERT INTO `dbusers` ($fields) VALUES ($values)»;
$result = mysql_query($sql);
Projects.Update($id);
return $result;
}
$server->wsdl->addComplexType(
‘TUsers’, ‘complexType’, ‘struct’, ‘all’, »,
array(
‘id’ => array(‘name’ => ‘id’, ‘type’ => ‘xsd:integer’),
‘user’=>array(‘name’ => ‘user’, ‘type’ => ‘xsd:string’),
‘pass’=>array(‘name’ => ‘pass’, ‘type’ => ‘xsd:string’)
)
);
$server->wsdl->addComplexType(
‘TUsersArray’, ‘complexType’, ‘array’, ‘sequence’, ‘SOAP-ENC:Array’, array(),
array(
array(‘ref’ => ‘SOAP-ENC:arrayType’,
‘wsdl:arrayType’ => ‘tns:TUsers[]’
)
),
‘tns:TUsers’);
$server->register(«AddArray»,
array(‘users’ => ‘tns:TUsersArray’),
array(),
$ns,
false,
«rpc»,
«literal»,
«»);
pero al mandar el array por Delphi me manda dicho error :'(
creo q encontre la falla pero no se como resolverla,
me parece que el error esta al tratar de tomar los valores del array de estructura,
podrias decirme como lo hago?
como por ejemplo el msj anterior, desde delphi mando el array TUsersArray,
como hago en php para acceder a cada TUsers dentro de ese array y guardar el valor «user» en una variable?
muchas gracias!