MSNATAPI API-REST NATURAL/ADABAS
Ahora es posible acceder desde sus aplicaciones Java, PHP, C# , etc... a desarrollos Natural/Adabas mediante el uso de API-REST sin la necesidad de utilizar EntireX.
.png)
MSNATAPI EN ACCION
Se requiere un servicio Linux (VM,Docker) donde se ejecuta el servicio Node.js que conecta con el servidor donde reside Natural/Adabas (Linux,Unix).
En el servidor Natural/Adabas, solo se requiere del servicio Multithread encargado de conectar con una bateria de procesos natural BATCH que responden a las peticiones del servidor Linux.
.png)
http/s. Método GET
API-REST Método GET
url: http:// SERVIDOR /api/msnat? server =colas& callnat =subprograma& data = a rea-de-datos
SERVIDOR => Dirección del servidor MSNATAPI
server = Colas de mensajes definidas en el servidor. entorno (PROD,TEST,DESA) o aplicación (FACT,HHRR,etc)
callnat = Subprograma natural a ejecutar.
data = Datos de entrada para el subprograma Natural (PARM-IN)
Ejemplo con curl :
$ curl " http://localhost:3000/api/msnat?server=SERV&callnat=echo&data=OK "
{"error":false,"message":"OK ETID R1887457 OK ECHO","size":24}
Error que devuelve cuando no existe el subprograma.
$ curl "http://flanders:3000/api/msnat?server=SERV&callnat= noexiste &data=OK"
{"error": true ,"message":"ERROR CALLDYN 00082 0230 ","size":66}
Ejemplo subprograma Natural
0010 **********************************************************************
0020 * FILE : ECHO
0005 *
0060 **********************************************************************
0070 *
0080 DEFINE DATA PARAMETER
0090 1 #PARM-IN (A) DYNAMIC
0100 1 #PARM-OUT (A)
DYNAMIC
0110 1 #RESP (I4)
0120 LOCAL
0130 1 #PARM-COM (A8)
0140 1 #PARM-ERROR (A60)
0150 1 REDEFINE #PARM-ERROR
0160 2 #RESPONSE (A2)
0170 2 #ERR-PROG (A8)
0180 2 #ERR-NR (N5)
0190 2 #ERR-NL (N4)
0200 *
0220 END-DEFINE
0230 INCLUDE ERR-COM
0240 RESET #PARM-OUT #RESP
0250 COMPRESS 'ETID' *ETID #PARM-IN 'ECHO' INTO #PARM-OUT
0260 END
Cree un SUBPROGRAMA Natural y defina el siguiente área de parámetros
PARM-IN
Son los datos enviados por el cliente que realiza la llamada API-REST en el parámetro
data
de la url.
PARM-OUT
.
Son los datos que recibe el cliente que realiza la llamada API-REST.
RESP. Para uso interno.
Redefina las áreas de datos en función de sus necesidades.
Incluir ON-ERROR (ERR-COM). En caso de error
url : http://localhost:3000/api/msnat?server=PROD&callnat=ECHO&data=PRUEBA
El mensaje recibido está en formato JSON.
{" error ":false," message ":"OK ETID R426056 primer dato ECHO"," size ":31}
devuelve los atributos:
error
:false|true En caso de error , puede aparecer el error capturado por ON ERROR de natural o por caída de la conexión.
message
Los datos enviados por el subprograma o el mensaje de error en caso de que el atributo error sea true.
size
. Tamaño del mensaje enviado.
Es posible personalizar la respuesta del mensaje devuelto por el subprograma natural mediante una plantilla JSON.
Declaración Natural de respuesta:
1 BUFF (A500)
1 REDEFINE BUFF
2 LINEA (A50)
2 DETALLES(1:10)
3 INDICE (N2)
3 NUM-POL(N8)
3 NUM-VERSION-POL(N5)
2 FINLIN (A70)
fichero json: {
"cEtid" : 50 ,
"detalles" :
{ "count" : 10 ,
"indice" : 2 ,
"campo1" : 8 ,
"campo2" : 5 },
"final" : 70
}
"error":false,"size":1267,"data":{"cEtid":"ETID R778464 ","polizas":[{"indice":"01","campo1":"00000000","campo2":"00000"},{"indice":"02","campo1":"00000000","campo2":"00000"},{"indice":"03","campo1":"00000000","campo2":"00000"},{"indice":"04","campo1":"00000000","campo2":"00000"},{"indice":"05","campo1":"00000000","campo2":"00000"},{"indice":"06","campo1":"01058445","campo2":"00001"},{"indice":"07","campo1":"00000000","campo2":"00000"},{"indice":"08","campo1":"01058452","campo2":"00001"},{"indice":"09","campo1":"00000000","campo2":"00000"},{"indice":"10","campo1":"01058460","campo2":"00001"}],"final":"TOTAL 10 LINEAS
NATURAL -> API-REST
MSNATAPI
permite la ejecución de servicios API-REST alojados en internet o su red interna. Mediante el uso de un comando 'call' y la definición de un fichero json donde se indican los campos y tamaños a tratar.
CALL ‘MSAPREST’ ServMsAPI ->Servidor msapinat
Puerto ->Puerto
Server ->PROXY
FiledefServ ->campos y tamaño
url http://server:3000/...
response Campo dinamico.
1 BUFF (A500)
1 REDEFINE BUFF
2 LINEA (A50)
2 DETALLES(1:10)
3 INDICE (N2)
3 NUM-POL(N8)
3 NUM-VERSION-POL(N5)
2 FINLIN (A70)
{
"cEtid":50,
"detalles" :
{ "count" : 10 ,
"indice" : 2 ,
"campo1" : 8 ,
"campo2" : 5 },
"final" : 70
}
NATURAL -> NATURAL
Realiza llamadas a subprogramas Natural ubicados en otros servidores.
Ejemplo:
CALL ‘MSAPCALL’ ServMsAPI ->Servidor msapinat
Puerto ->Puerto
Server ->Cola (SERVER)
Subprog ->subprograma Nat.
parm-in ->Datos entrada
parm-out ->Datos salida.
resp -> Integer
Ejemplo Java. Acceso API-REST Natural
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class test {
public static void main(String[] args) throws ClientProtocolException, IOException {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://servidor/api/msnat?server=SERVER&callnat=ECHO&data=prueba");
HttpResponse response = client.execute(request);
BufferedReader rd = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
System.out.println(line); }
}}
Autenticación JWT (Json Web Token)
Las peticiones pueden ir autenticadas con JWT.
Desde el entorno de administración web, se solicita la generación de un token y este es suministrado al consumidor del servicio mediante el parámetro token o en authorization de header.
Ejemplo con curl:
$ curl "http://server:3000/api/msnat?server=SERVER&callnat=echo&data=OK&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicHJ1ZWJhIiwiaWF0IjoxNTY5MzE5MjY0LCJleHAiOjE2MDA4NTUyNjR9.EWYOipcnJN8yHcbcT4ImcsxUSSS0Z1v8ZYnUQXbmpHc"
{"error":false,"message":"OK ETID R1356611 OK ECHO","size":24}
Modificamos el token para que sea incorrecto
$ curl "http://flanders:3000/api/msnat?server=SERVER&callnat=echo&data=OK&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoicHJ1ZWJhIiwiaWF0IjoxNTY5MzE5MjY0LCJleHAiOjE2MDA4NTUyNjR9.EWYOipcnJN8yHcbcT4ImcsxUSSS0Z1v8ZYnUQXbmpHcNOO"
{"error":true,"message":"Token Invalido"}
MONITOR MSNATAPI
Herramienta que permite monitorizar y administrar los servicios API-REST Natural/Adabas.
Cuadro de mandos que muestra el total de transacciones ejecutadas y cuantas veces se ha ejecutado cada una de ellas.
La opción de administración permite conectar/desconectar los servicios Natural/Adabas.
Generar token para permitir acceso al consumidor del servicio.
Test permite ejecutar una query REST-API devolviendo el resultado y mostrando la query construida.
PRUEBAS DE RENDIMIENTO
Las pruebas realizadas con Jmeter han sido las siguientes:
Ejecución de un subprograma Natural que accede a Adabas y lee 10 registros de un total de 800.000.
Usuarios concurrentes : 200.
Ejecutar el subprograma 200 veces cada uno (40.000) .
Pool de conexiones Natural activas : 14 y 15 Sesiones Natural .
4 - CPUs currently
602 - MHz CPU clock rate
PowerPC_RS64-IV - Processor 5.3.12.5 TL06 - AIX Kernel Version
IBM,7026-6H1 - Machine Type
RENDIMIENTO
90,5/Segundo
Ventajas
- Mejoras en velocidad de ejecución. Los servicios natural están a la espera de recibir mensajes para ejecutar los subprogramas.
- En función de las necesidades se dispone de un pool de sesiones natural en ejecución para garantizar el servicio.
- Mediante el API REST se puede acceder a los recursos desde cualquier lenguaje (Java, C# , python, php, javascript, etc).
- Permite el desarrollo de microservicios y la posibilidad de utilizar un api gateway tipo (kong,wso2,...).
- Encapsula el servicio ayudando a la migración de entornos Linux donde poder utilizar contenedores Docker y kubernetes.
- No se requiere ENTIREX.
- Sustituir servicios ofrecidos por applinx y Natural Screen Builder.
- Cambiar query’s realizadas con CONNX.
- Sustituir API Entire Network.
- No requiere licencias.