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.


Odoo • Image and Text

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.

 

Odoo • Image and Text

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.