Para este laboratorio consumiremos un API Restful que tenga comunicación de tipo json; ya en una anterior publicación vimos como crear un API Rest, en este caso vamos a crear un cliente que permita consumir un API Restful utilizando el método POST.

Para este proyecto crearemos un proyecto de tipo Java Maven, no es necesario que sea de tipo web application y estoy usando java 8.

Consumiremos un API interna:

http://172.28.45.81/PS.CGP.PublicInterface/api/PIN/

Esta API posee un método llamado GetAccountInfo, en el cual consultaremos los datos de un usuario de prueba.

Dentro del paquete del proyecto crearemos 2 clases:

  • BaseReq
  • Prueba

Estas clases se utilizarán para toda la demo del cliente del API.

Dentro de nuestro pom.xml debemos agregar las siguientes dependencias ya que las necesitaremos para consultar el API Restful:

<dependencies>
   <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.6</version>
      <type>jar</type>
   </dependency>
   <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>javax.ws.rs-api</artifactId>
      <version>2.0</version>
   </dependency>
   <dependency>
      <groupId>org.jboss.resteasy</groupId>
      <artifactId>resteasy-client</artifactId>
      <version>3.1.0.Final</version>
   </dependency>
   <dependency>
      <groupId>javax.json</groupId>
      <artifactId>javax.json-api</artifactId>
      <version>1.1.4</version>
   </dependency>
   <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20180130</version>
      <type>jar</type>
   </dependency>
</dependencies>

Luego de haber colocado todas nuestras dependencias realizamos un build de la aplicación y ahora sí vamos a programarlo.

Dentro de la clase BaseReq.java únicamente crearemos las siguientes variables, junto con sus setters y sus getters:

Luego de ello, nos iremos a la clase Prueba.java, dentro de la clase crearemos el método main e importaremos las siguientes referencias:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.json.JsonObject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.Response;

Ahora, dentro el método main, usaremos el siguiente código para realizar la consulta al API, lo iré explicando sección por sección, al final hay una imagen resumen del código:

public static void main(String[] args) {
//Esta variable res la usaremos únicamente para dar un respuesta final
String res = "";
String URL = "http://172.28.45.81/PS.CGP.PublicInterface/api/PIN/";
try {
//Creamos el cliente de conexión al API Restful
      Client client = ClientBuilder.newClient();

//Creamos el target lo cuál es nuestra URL junto con el nombre del método a llamar
      WebTarget target = client.target(URL + "GetAccountInfo");

//Creamos nuestra solicitud que realizará el request
      Invocation.Builder solicitud = target.request();

//Creamos y llenamos nuestro objeto BaseReq con los datos que solicita el API
      BaseReq req = new BaseReq();
      req.setHostId("Z+W8pqkq/2DbF58Eo2dUcZMUTcGU6t4eouRhllHA");
      req.setOperationId("31e32-8f53ed89");
      req.setClientIPAddress("127.0.0.1");
      req.setCultureCode("ES-CR");
      req.setAccountNumber("CR00081411111111111111");

//Convertimos el objeto req a un json
      Gson gson = new Gson();
      String jsonString = gson.toJson(req);
      System.out.println(jsonString);

//Enviamos nuestro json vía post al API Restful
      Response post = solicitud.post(Entity.json(jsonString));

//Recibimos la respuesta y la leemos en una clase de tipo String, en caso de que el json sea tipo json y no string, debemos usar la clase de tipo JsonObject.class en lugar de String.class
      String responseJson = post.readEntity(String.class);
      res = responseJson;

//Imprimimos el status de la solicitud
      System.out.println("Estatus: " + post.getStatus());

      switch (post.getStatus()) { 
             case 200:
                     res = responseJson;
                     break;
             default:
                     res = "Error";
                     break; 
                             }

} catch (Exception e) { 
//En caso de un error en la solicitud, llenaremos res con la exceptión para verificar que sucedió
      res = e.toString();
} 
//Imprimimos la respuesta del API Restful
      System.out.println(res);
}

De esta manera al ejecutar la clase, recibiremos una respuesta como la siguiente, en la cual veremos el json enviado, el estatus recibido y el json recibido:

Los estatus son súper importantes saberlos manejar, ya que existen varios, algunos de ellos son:

  • 503 – Error interno del servidor
  • 404 – página no encontrada
  • 200 – solicitud satisfactoria

Entre otros, estos estatus son los que recibimos con post.getStatus(), de esta manera en caso de que el API esta caído o de error, podemos manejar la respuesta.

En caso de requerir enviar algún header, por ejemplo un accessToken, podemos usar el siguiente código debajo de la declaración de la solicitud del request:

solicitud.header("Authorization", accessToken);

Este proceso se puede comprimir mucho más para hacerlo aún más eficiente, de tal forma que lo podemos convertir a una función que se vea como la siguiente:

Así podemos crear n cantidad de métodos para interactuar con el API.

Cada API tiene su propia documentación de como funciona, no todas son iguales, por lo que siempre es bueno leerla, algunas API públicas no requieren un token de acceso, otras sí, algunas requieren un método de autenticación y uno de deslogueo, por lo que mi recomendación esque podemos usar esta base para interactuar con un API usando el método POST, así no exponemos nuestros datos usando el método GET, sin embargo puede diferir un poco, dependiendo del API Restful a consumir.

12 respuestas a «Cómo consumir un API Restful usando el método POST en Java»

  1. Hola, excelente nota, gracias por tu aporte, queria consultarte, yo uso solo 2 datos en el request y me esta dando este error:

    {«tipoDocumento»:»2″,»numeroDocumento»:»74163187″}
    javax.ws.rs.ProcessingException: RESTEASY004655: Unable to invoke request

    1. GetAccountInfo es un método propio de API que estoy consumiendo en el ejemplo, es solamente para efectos de demostración pero la autenticación sirve para cualquier API que use oauth 2, al mismo tiempo dependiendo el API, ese url cambiará, pero todo depende de la documentación que diga el API.

      1. Entonces ¿El método GetAccountInfo ya viene predeterminado? es que me sale un error 404 y no se por que me sale… Por donde podría contactar contigo para ampliar el error que me sale.

  2. Hola buenas tardes, tendra un ejmplo con el metodo get pero enviado parametros en el body, hasta donde he podido encontrar solo hay con params, pero en mi caso necesito enviar unos parametros en el body al momento de realizar el metodo GET.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *