diff --git a/README.md b/README.md index 38789ca..7ce5da1 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,24 @@ # **Servidor jRDC2-Multi Mod (B4J)** -## **1\. Introducción** +## **1. Introducción** Este proyecto es una versión modificada del servidor [jRDC2 original](https://www.b4x.com/android/forum/threads/b4x-jrdc2-b4j-implementation-of-rdc-remote-database-connector.61801/#content), diseñada para actuar como un backend robusto y flexible. Su función principal es recibir peticiones HTTP, ejecutar comandos SQL predefinidos contra una base de datos y devolver los resultados en un formato estructurado. Ha sido adaptado para servir tanto a clientes nativos (`B4A/B4i`) como a clientes web modernos (`JavaScript`, a través de frameworks como `NodeJS, React, Vue, Angular, etc`.). -## **2\. Características Principales** +----- -- **Soporte para Múltiples Bases de Datos**: Puede cargar y gestionar hasta 4 archivos de configuración (`config.properties`) simultáneamente. -- **Comandos SQL Externalizados**: Las sentencias SQL se definen en los archivos de configuración, permitiendo modificarlas sin recompilar el servidor. -- **Doble Handler de Peticiones**: Incluye un handler clásico para clientes B4X y un handler JSON para clientes web. -- **Validaciones de Seguridad**: Verifica la existencia de comandos y la correspondencia en el número de parámetros. -- **Administración Remota**: Permite verificar el estado, recargar la configuración y reiniciar el servidor a través de URLs específicas. +## **2. Características Principales** -## **3\. Configuración** + * **Soporte para Múltiples Bases de Datos**: Puede cargar y gestionar hasta 4 archivos de configuración (`config.properties`) simultáneamente. + * **Comandos SQL Externalizados**: Las sentencias SQL se definen en los archivos de configuración, permitiendo modificarlas sin recompilar el servidor. + * **Doble Handler de Peticiones**: Incluye un handler clásico para clientes B4X y un handler JSON para clientes web. + * **Validaciones de Seguridad**: Verifica la existencia de comandos y la correspondencia en el número de parámetros antes de la ejecución. + * **Administración Remota**: Permite verificar el estado, recargar la configuración y reiniciar el servidor a través de URLs específicas, con un sistema de autenticación. + +----- + +## **3. Configuración** ### **3.1. Archivos de Configuración** @@ -22,15 +26,15 @@ El sistema está preparado para manejar hasta **cuatro configuraciones de bases La nomenclatura de los archivos es fundamental: -- `config.properties` (para `DB1`) -- `config.DB2.properties` -- `config.DB3.properties` -- `config.DB4.properties` + * `config.properties` (para `DB1`) + * `config.DB2.properties` + * `config.DB3.properties` + * `config.DB4.properties` **Notas importantes:** -- El **puerto** del servidor se toma **únicamente** del archivo principal `config.properties`, sin importar lo que digan los demás. -- Los datos de conexión (`JdbcUrl`, `usuario`, `contraseña`) sí se toman del archivo correspondiente a cada base de datos. + * El **puerto** del servidor se toma **únicamente** del archivo principal `config.properties`, sin importar lo que digan los demás. + * Los datos de conexión (`JdbcUrl`, `usuario`, `contraseña`) sí se toman del archivo correspondiente a cada base de datos. ### **3.2. Añadir Drivers de Bases de Datos Adicionales** @@ -43,38 +47,52 @@ Si necesitas conectarte a otros tipos de bases de datos (ej. Oracle), debes agre Al compilar, el driver se incluirá en el `.jar` final del servidor, por lo que no será necesario copiarlo por separado al directorio de producción. -## **4\. Uso del Handler Clásico (Para Clientes B4X)** +----- + +## **4. Validaciones de Seguridad** + +El servidor realiza dos comprobaciones automáticas **en ambos handlers (B4X y JSON)** antes de ejecutar cualquier consulta: + +1. **Verificación de Existencia del Comando**: El servidor comprueba que el nombre del comando SQL solicitado (ej. `"get_user"`) exista como una clave válida en el archivo `.properties` correspondiente. Si no lo encuentra, devolverá un error y no intentará ejecutar nada. + +2. **Conteo de Parámetros**: Si el comando SQL en el archivo de configuración espera parámetros (contiene `?`), el servidor cuenta cuántos son y lo compara con el número de parámetros recibidos en la petición. Si las cantidades no coinciden, devolverá un error específico, evitando una ejecución fallida en la base de datos. + +Estas validaciones aseguran que el desarrollador reciba feedback inmediato y claro si una petición está mal formada. + +----- + +## **5. Uso del Handler Clásico (Para Clientes B4X)** Este handler mantiene la compatibilidad con `DBRequestManager`. La selección de la base de datos se realiza dinámicamente a través de la URL. -- Para `config.properties` \=\> `http://tu-dominio.com:8090` -- Para `config.DB2.properties` \=\> `http://tu-dominio.com:8090/DB2` -- Para `config.DB3.properties` \=\> `http://tu-dominio.com:8090/DB3` -- Para `config.DB4.properties` \=\> `http://tu-dominio.com:8090/DB4` + * Para `config.properties` =\> `http://tu-dominio.com:8090` + * Para `config.DB2.properties` =\> `http://tu-dominio.com:8090/DB2` + * Para `config.DB3.properties` =\> `http://tu-dominio.com:8090/DB3` + * Para `config.DB4.properties` =\> `http://tu-dominio.com:8090/DB4` -## **5\. Uso del DBHandlerJSON (Para Clientes Web)** +----- + +## **6. Uso del DBHandlerJSON (Para Clientes Web)** Este handler está diseñado para clientes que se comunican vía `JSON`, como aplicaciones web JavaScript. -### **5.1. Endpoint y Métodos de Envío** +### **6.1. Endpoint y Métodos de Envío** Las peticiones van dirigidas al endpoint `/DBJ`. El handler es flexible y acepta datos de dos maneras: **Método Recomendado: POST con Body JSON** -Esta es la forma más limpia y estándar para las APIs modernas. - -- **Método HTTP**: POST -- **URL**: http://tu-dominio.com:8090/DBJ -- **Header Requerido**: Content-Type: application/json -- **Body (Payload)**: El objeto JSON se envía directamente en el cuerpo de la petición. + * **Método HTTP**: POST + * **URL**: `http://tu-dominio.com:8090/DBJ` + * **Header Requerido**: `Content-Type: application/json` + * **Body (Payload)**: El objeto JSON se envía directamente en el cuerpo de la petición. **Ejemplo de Body:** -``` +```json { "dbx": "DB2", - "query": "get\_user", + "query": "get_user", "exec": "executeQuery", "params": [ "CDAZA" @@ -84,22 +102,20 @@ Esta es la forma más limpia y estándar para las APIs modernas. **Método Legacy: GET con Parámetro `j`** -Este método se mantiene por retrocompatibilidad. + * **Método HTTP**: GET + * **URL**: El JSON completo se envía como el valor del parámetro `j` en la URL. -- **Método HTTP**: GET (o POST con Content-Type: application/x-www-form-urlencoded) -- **URL**: El JSON completo se envía como el valor del parámetro `j` en la URL. +**Ejemplo con GET:** +`http://tu-dominio.com:8090/DBJ?j={"dbx":"DB2","query":"get_user","exec":"executeQuery","params":["CDAZA"]}` -Ejemplo con GET: -http://tu-dominio.com:8090/DBJ?j={"dbx":"DB2","query":"get\_user","exec":"executeQuery","params":["CDAZA"]} - -### **5.2. Formato del Payload JSON** +### **6.2. Formato del Payload JSON** La estructura del objeto JSON es la misma para ambos métodos: -``` +```json { "exec": "executeQuery", - "query": "nombre\_del\_comando\_sql", + "query": "nombre_del_comando_sql", "dbx": "DB1", "params": [ "valor1", @@ -108,23 +124,38 @@ La estructura del objeto JSON es la misma para ambos métodos: } ``` -- `exec`: `"executeQuery"` (para SELECT) o `"executeCommand"` (para INSERT, UPDATE, DELETE). -- `query`: Nombre del comando SQL tal como está definido en el archivo de configuración (ej. `select\_user`). -- `dbx` (opcional): La llave de la base de datos (`DB1`, `DB2`, etc.). Si se omite, se usará **DB1** por defecto. -- `params` (opcional): Un objeto que contiene los parámetros para la consulta SQL. + * `exec`: `"executeQuery"` (para `SELECT`) o `"executeCommand"` (para `INSERT`, `UPDATE`, `DELETE`). + * `query`: Nombre del comando SQL tal como está definido en el archivo de configuración. + * `dbx` (opcional): La llave de la base de datos (`DB1`, `DB2`, etc.). Si se omite, se usará **DB1**. + * `params` (opcional): Un **array** que contiene los parámetros para la consulta SQL, en el orden exacto que se esperan. -### **5.3. Respuestas JSON** +### **6.3. Respuestas JSON** Las respuestas del servidor siempre son en formato JSON e incluyen un campo booleano `success`. -- **Si success es true**, los datos se encontrarán en la llave `result`. -- **Si success es false**, el mensaje de error se encontrará en la llave `error`. + * **Si `success` es `true`**, los datos se encontrarán en la llave `result`. + * **Si `success` es `false`**, el mensaje de error se encontrará en la llave `error`. -## **6\. Administración del Servidor** +----- -Se pueden ejecutar comandos de gestión directamente desde un navegador o una herramienta como cURL. +## **7. Administración del Servidor** -- **Verificar Estado**: `http://tu-dominio.com:8090/test` -- **Recargar Configuración**: `http://tu-dominio.com:8090/manager?command=reload` (Vuelve a leer todos los archivos `config.\*.properties` sin reiniciar el servidor). -- **Reiniciar Servidor (Estándar)**: `http://tu-dominio.com:8090/manager?command=rsx` (Ejecuta los scripts `start.bat`, `start2.bat` y `stop.bat`). -- **Reiniciar Servidor (con PM2)**: `http://tu-dominio.com:8090/manager?command=rpm2` (Ejecuta `reiniciaProcesoPM2.bat` y asume que el nombre del proceso es "RDC-Multi". Modificar el `.bat` si el nombre es diferente). +Se pueden ejecutar comandos de gestión directamente desde un navegador o una herramienta como `cURL`. + +### **7.1. Comandos de Administración** + +#### **Comandos Públicos (sin autenticación)** + + * **Verificar Conectividad**: `http://tu-dominio.com:8090/ping` + * Responde con un simple `PONG` y la `hora` para confirmar que el servidor está en línea. + * **Verificar Estado Detallado**: `http://tu-dominio.com:8090/test` + * Muestra información sobre las conexiones a la base de datos y el estado general. + +#### **Comandos Protegidos (requieren autenticación)** + + * **Recargar Configuración**: `http://tu-dominio.com:8090/manager?command=reload` + (Vuelve a leer todos los archivos `config.*.properties` sin reiniciar el servidor). + * **Reiniciar Servidor (Estándar)**: `http://tu-dominio.com:8090/manager?command=rsx` + (Ejecuta los scripts `start.bat`, `start2.bat` y `stop.bat`). + * **Reiniciar Servidor (con PM2)**: `http://tu-dominio.com:8090/manager?command=rpm2` + (Ejecuta `reiniciaProcesoPM2.bat` y asume que el nombre del proceso es "RDC-Multi". Modificar el `.bat` si el nombre es diferente).