mirror of
https://github.com/KeymonSoft/jRDC-Multi.git
synced 2026-04-19 13:49:16 +00:00
Update README.md
This commit is contained in:
133
README.md
133
README.md
@@ -1,20 +1,24 @@
|
|||||||
# **Servidor jRDC2-Multi Mod (B4J)**
|
# **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.
|
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`.).
|
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.
|
## **2. Características Principales**
|
||||||
- **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.
|
|
||||||
|
|
||||||
## **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**
|
### **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:
|
La nomenclatura de los archivos es fundamental:
|
||||||
|
|
||||||
- `config.properties` (para `DB1`)
|
* `config.properties` (para `DB1`)
|
||||||
- `config.DB2.properties`
|
* `config.DB2.properties`
|
||||||
- `config.DB3.properties`
|
* `config.DB3.properties`
|
||||||
- `config.DB4.properties`
|
* `config.DB4.properties`
|
||||||
|
|
||||||
**Notas importantes:**
|
**Notas importantes:**
|
||||||
|
|
||||||
- El **puerto** del servidor se toma **únicamente** del archivo principal `config.properties`, sin importar lo que digan los demás.
|
* 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.
|
* 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**
|
### **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.
|
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.
|
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.properties` =\> `http://tu-dominio.com:8090`
|
||||||
- Para `config.DB2.properties` \=\> `http://tu-dominio.com:8090/DB2`
|
* Para `config.DB2.properties` =\> `http://tu-dominio.com:8090/DB2`
|
||||||
- Para `config.DB3.properties` \=\> `http://tu-dominio.com:8090/DB3`
|
* Para `config.DB3.properties` =\> `http://tu-dominio.com:8090/DB3`
|
||||||
- Para `config.DB4.properties` \=\> `http://tu-dominio.com:8090/DB4`
|
* 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.
|
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:
|
Las peticiones van dirigidas al endpoint `/DBJ`. El handler es flexible y acepta datos de dos maneras:
|
||||||
|
|
||||||
**Método Recomendado: POST con Body JSON**
|
**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`
|
||||||
- **Método HTTP**: POST
|
* **Header Requerido**: `Content-Type: application/json`
|
||||||
- **URL**: http://tu-dominio.com:8090/DBJ
|
* **Body (Payload)**: El objeto JSON se envía directamente en el cuerpo de la petición.
|
||||||
- **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:**
|
**Ejemplo de Body:**
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
"dbx": "DB2",
|
"dbx": "DB2",
|
||||||
"query": "get\_user",
|
"query": "get_user",
|
||||||
"exec": "executeQuery",
|
"exec": "executeQuery",
|
||||||
"params": [
|
"params": [
|
||||||
"CDAZA"
|
"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`**
|
**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)
|
**Ejemplo con GET:**
|
||||||
- **URL**: El JSON completo se envía como el valor del parámetro `j` en la URL.
|
`http://tu-dominio.com:8090/DBJ?j={"dbx":"DB2","query":"get_user","exec":"executeQuery","params":["CDAZA"]}`
|
||||||
|
|
||||||
Ejemplo con GET:
|
### **6.2. Formato del Payload JSON**
|
||||||
http://tu-dominio.com:8090/DBJ?j={"dbx":"DB2","query":"get\_user","exec":"executeQuery","params":["CDAZA"]}
|
|
||||||
|
|
||||||
### **5.2. Formato del Payload JSON**
|
|
||||||
|
|
||||||
La estructura del objeto JSON es la misma para ambos métodos:
|
La estructura del objeto JSON es la misma para ambos métodos:
|
||||||
|
|
||||||
```
|
```json
|
||||||
{
|
{
|
||||||
"exec": "executeQuery",
|
"exec": "executeQuery",
|
||||||
"query": "nombre\_del\_comando\_sql",
|
"query": "nombre_del_comando_sql",
|
||||||
"dbx": "DB1",
|
"dbx": "DB1",
|
||||||
"params": [
|
"params": [
|
||||||
"valor1",
|
"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).
|
* `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`).
|
* `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** por defecto.
|
* `dbx` (opcional): La llave de la base de datos (`DB1`, `DB2`, etc.). Si se omite, se usará **DB1**.
|
||||||
- `params` (opcional): Un objeto que contiene los parámetros para la consulta SQL.
|
* `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`.
|
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 `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 `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`
|
Se pueden ejecutar comandos de gestión directamente desde un navegador o una herramienta como `cURL`.
|
||||||
- **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`).
|
### **7.1. Comandos de Administración**
|
||||||
- **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).
|
|
||||||
|
#### **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).
|
||||||
|
|||||||
Reference in New Issue
Block a user