Solicitud REST al Agente de servicios web desde JAVA

Objetivo

JSON
El manejo de JSON en el lenguaje de JAVA se puede hacer mediante la librería llamada JSON simple, esta librería tiene la implementación para los objetos de tipo JSONObject y JSONArray; adicionalmente la librería ofrece otras funciones para conversiones de JSON a String y viceversa.
Instalación de la librería (NetBeans)
Primero necesitamos descargar la librería llamada json-simple-1.1.1.jar de su web oficial aquí https://code.google.com/archive/p/json-simple/, paso seguido debemos incorporarla a nuestro proyecto, para esto realizamos los siguientes pasos:
  • Nos posicionamos en la capeta libraries de nuestro proyecto en netbeans
  •  
  • Seleccionamos la opción de adicionar un JAR/Folder.
  •  
  • En el selector de archivos que se nos presenta seleccionamos la librería json-simple-1.1.1.jar de la carpeta donde este almacenado.
JSONObject
La clase JSONObject representa el valor de un objeto JSON inmutable (una colección desordenada de cero o más pares de nombre/valor). Las llaves del JSONObject solo pueden definirse como String mientras los valores de este JSONObject pueden ser de cualquier combinación (JSONObject, JSONArray, Integer, Double, Boolean, String)
 
Código JAVA Representación en JSONObject
JSONObject obj = new JSONObject();
obj.put("name", "foo");
obj.put("num", new Integer(100));
obj.put("balance", new Double(1000.21));
obj.put("is_vip", new Boolean(true));
System.out.print(obj);
{ "name": " foo ", "num": 100, "balance": 1000.21, "Italia": true }
JSONArray
La clase JSON Array representa una secuencia ordenada de valores indexados donde los valores pueden ser de cualquier combinación (JSONObject, JSONArray, Integer, Double, Boolean, String).
Código JAVA Representación en JSONArray
JSONArray arr = new JSONArray();
arr.add("foo");
arr.add(new Integer(100));
arr.add(new Double(1000.21));
arr.add(new Boolean(true));
arr.add(new JSONObject());
System.out.print(arr);
{ "name": " foo ", "num": 100, "balance": 1000.21, "Italia": true }
Codificación y decodificación de JSON
La librería también ofrece funcionalidades que permiten convertir una cadena de texto en un objeto JSON la cual será muy útil para convertir la respuesta de la petición, para esto podremos usar el objeto JSONParser:
Código JAVA para decodificar un JSON
String str = '{
"name":"foo",
"num":100,
"balance": 1000.21,
"Italia":true,
"obj":{……}
}'
La codificación que podemos definir como el proceso para convertir un JSON a una cadena de texto, es más sencillo pues es una propiedad que tienen todos los objetos de la librería JSONSimple, la codificación es muy útil para el momento de convertir un JSON para ser enviado en una petición:
Código JAVA Representación del JSON
JSONObject obj = new JSONObject();
obj.put("name", "foo");
obj.put("num", new Integer(100));
obj.put("balance", new Double(1000.21));
obj.put("is_vip", new Boolean(true));
obj.put("detail", new JSONObject());
obj.toJSONString()
{ "name": " foo ", "num": 100, "balance": 1000.21, "is_vip": true, "Detail":{} }
Request
Objeto URL
Esta clase es utilizada para establecer conexión con un recurso, archivo o directorio que se encuentra publicado a través de una URL, la definición de un objeto URL en código no representa una apertura de conexión con el recurso, solo representa la definición de un recurso que se va a consumir. La ruta que se defina en el objeto URL debe de ser estricto es decir acompañado de un protocolo, un host o ip, un puerto en caso de ser necesario y el path que indica la ubicación del recurso.
Código JAVA para definir una URL
try {
URL myURL = new URL ('http://insoft:80//DSAdmin/GetPlatformName/');
}
catch (MalformedURLException e) {
// exception handler code here
// ...
}
HttpURLConnection
Esta clase nos permitirá abrir la conexión con un objeto URL previamente definido, de esta manera podremos definir las cabeceras que queremos enviar, el método o verbo a utilizar en la solicitud HTTP y definir los datos que se enviarán en la petición. Cada instancia de este objeto se utiliza para realizar una única solicitud.
Código JAVA para abrir una solicitud HTTP
URL myURL = new URL ('http://insoft:80//DSAdmin/GetPlatformName/');
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.getOutputStream().write('Texto enviado al server');
BufferedReader
Esta clase nos permite leer texto de una secuencia de entrada de caracteres, almacenando en el buffer caracteres para proporcionar la lectura eficiente. Esta clase nos será útil para leer la respuesta entregada por el HttpURLConnection pues tiene la funcionalidad de leer en un formato de codificación definido.
Código JAVA leer la respuesta en un ReaderL
URL myURL = new URL
('http://insoft:80//DSAdmin/GetPlatformName/');
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.getOutputStream().write('Texto enviado al server');
Reader in = new BufferedReader(newInputStreamReader(conn.getInputStream(), "UTF-8"));
Ejemplo funcional
El siguiente ejemplo realiza una petición que muestra el listado de terceros obtenidos de un agente de servicios web de ContaPyme (ASW) en una tabla de tipo JTable. Para esto primero se debe hacer GetAuth contra el agente para obtener el KeyAgent con el cual se realizara la solicitud de listado de terceros.
requestPOST
Esta función recibe como parámetro la URL a la cual se realizara la solicitud POST y un JSONObject que se enviará en la petición, la función obtendrá el String de la petición y convertirá este en un JSONObject el cual retornará.
public JSONObject requestPost(String sURL, JSONObject JSONSend) throws Exception{
   //se crea el objeto de tipo URL
   URL url = new URL(sURL);
   //Convierte el JSONObject a un string y despues a un arreglo de Bytes
   byte[] postDataBytes = JSONSend.toJSONString().getBytes("UTF-8");
   //Abre la conexión y asigna el objeto de la conexion a conn
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   //establece el metodo o verbo de la conexión    conn.setRequestMethod("POST");
   //se establece que la solicitud tendrá salida
    conn.setDoOutput(true);
   //se escribe el cuerpo de la solicitud con el JSON convertido a Bytes
   conn.getOutputStream().write(postDataBytes);
   //Se realiza la solicitud y se lee la respuesta de la misma en el Reader
   Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
   //Se convierte el Reader en un String
   StringBuilder sb = new StringBuilder();
   for (int c; (c = in.read()) >= 0;)
   sb.append((char)c);
   String response = sb.toString();
   //Se crea el objeto que parseará la respuesta
   JSONParser parser = new JSONParser();
   //Se parsea la respuesta en un JSONObject
   JSONObject jsonResult = (JSONObject) parser.parse(response);
   //se Retorna la respuesta
   return jsonResult; }
}
getKeyAgent
Esta función construirá el JSON necesario para la autenticación contra el Agente de servicios web (ASW), paso seguido realizará la solicitud de GetAuth, y retornará el KeyAgente entregado por el servidor. Para esto tomará los valores de usuario y contraseña de los dos textfield creados en diseño y utilizaremos la función MD5 para encriptar la contraseña.
public String getControlKey {
   //se define que por defecto entregará un key vacio.
   String sKey ="";
   try {
      //se define la URL a donde se realizará la solicitud.
      String sUR1 ="http://local.insoft.co:9000/dataspan/restTBasicoGeneral/\"GetAuth\"/";
      //Abre la conexión y asigna el objeto de la conexión a conn
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      //establece el metodo o verbo de la conexión
      conn.setRequestMethod("POST");
      //Se establece que la solicitud tendrá salida
      conn.setDoOutput(true);
      //se escribe el cuerpo de la solicitud con el JSON convertido a Bytes
      conn.getOutputStream().write(postDataBytes);
      //se realiza la solicitud y se lee la respuesta de la misma en el Reader.
      Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
      //se convierte el reader en un String.
      StringBuilder sb = new StringBuilder();
      for (int c; (c = in.read()) >= 0;)
      sb.append((char)c);
       String response = sb.toString();
      //se crea el objeto que parseará la respuesta
      JSONParser parser = new JSONParser();
      //se parsea la respues en un JSONObject
      JSONObject jsonResult = (JSONObject) parser.parse(response);
      //Retorna la respuesta
      return jsonResult; }
}
getListaTerceros
Esta función recibe el key Agente obtenido anteriormente y construye el JSON para realizar la petición de obtener el listado de terceros, como resultado esta función retornara un JSONArray con el listado de terceros.
public JSONArray getListaTerceros(String keyAgent){
   //Se define el resultado por defecto
   JSONArray jResult = null;
   try {
      //Se define la URL a la cual se realizará la solicitud
      String sURl =       "http://local.insoft.co:9000/datasnap/rest/TCatTerceros/\"GetListaTerceros\"/";
      //Se define el JSON que contendrá todos los parametros a enviar
      JSONObject obj = new JSONObject();
      //Se define el Array que contiene los 4 parametros de entrada de la función
      JSONArray arr = new JSONArray();
      //se define el objeto que contiene los datos de autenticación
      JSONObject objTemp = new JSONObject();
      //Se crea un JSON parse para definir JSON genéricos
      JSONParser parser = new JSONParser();
       //Se parsea y adiciona información de los datos de la página
      objTemp.put("datospagina", (JSONObject) parser.parse("       {\"cantidadregistros\":\"99\",\"pagina\":\"1\"}"));
      //Se parsea y adiciona los datos que se solicitarán
      objTemp.put("camposderetorno",(JSONArray) parser.parse("       [\"init\",\"ntercero\",\"napellido\"]"));
      //se adiciona el primer parámetro con el JSON de datos
      arr.add(objTemp.toJSONString());
      //Se adiciona el keyAgent obtenido previamente
      arr.add(keyAgent);
      //Se adiciona el tercer parámetro que es el código del APP configurado
      arr.add("1001");
      //Se envía en el cuarto parámetro un random
      arr.add("123");
      //Se adiciona el arreglo de parametros al objeto a enviar
      obj.put("_parameters", arr);
      //se realiza la solicitud POST
      JSONObject objResult = requestPost(sURl,obj);
      //Se obtiene el Arreglo con los datos
      arr = (JSONArray)objResult.get("result");
      obj = (JSONObject)arr.get(0);
      obj = (JSONObject)obj.get("respuesta");
      jResult = (JSONArray)obj.get("datos");
      }
         catch (Exception e) {
         System.out.println(e.getMessage());
      }
//Se retorna el arreglo
return jResult;
}
Implementación de las funciones
La implementación se realiza sobre el evento clic del botón, en este lo primero que se hace es obtener el keyAgente y validar que este sea correcto, paso seguido se obtiene el listado de terceros el cual es almacenado en un JSONArray el cual se recorrerá para obtener cada uno de los objetos que se encuentran definidos en este y agregarlos al control JTable.
private void BtnSendRequestActionPerformed(java.awt.event.ActionEvent evt) {
   //Se obtiene el KeyAgent del ASW
   String sKey = getControlKey();
   //Se muestra el KeyAgente que se ha obtenido
   LblKeyAgent.setText("key agente de conexión "+sKey);
   //Se verifica que el keyAgente tenga algún valor
   if (sKey != ""){
      //Se desactivan los controles relacionados al getAuth
      edUser.setEnabled(false);
      edPassword.setEnabled(false);
      BtnSendRequest.setEnabled(false);
      //Se solicita el listado de terceros
      JSONArray arrTerceros = getListaTerceros(sKey);
      //Se obtiene el modelo de la tabla visual que se tiene
      DefaultTableModel model = (DefaultTableModel) DateViewTableJSON.getModel();
      //Se define un vector que hará referencia a cada registro
      Vector row;
      //Se define el jsonObject temporal para recorrer los registros
      JSONObject record;
      //se recorre el arreglo de registros
      for (int i=0; i < arrTerceros.size(); i++){
         //Se extrae el JSON de cada registro
         record = (JSONObject)arrTerceros.get(i);
         //Se crea el vector
         row = new Vector();
         //Se adicionan los valores al vector
         row.add(record.get("init"));
         row.add(record.get("ntercero"));
         row.add(record.get("napellido"));
         //se adiciona el vector al modelo
         model.addRow(row);
       }
   }
}
Resultado de la implementación
©2016 InSoft Todos los derechos reservados.