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.
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.
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.