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.
Gracias Totales!
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
Puede ser que estés mezclando varios clientes http, habría que ver todo el código para ver si es un problema con las librerías o es algo más.
Crees que pueda pasartelo por este medio? llevo varios dias atrapado con ese error.
Mejor pásamelo a mi correo: oracle.max.consultor@gmail.com ahí te respondo
¿Esto mismo se puede hacer con Java 6? ¿Qué cambiaria?
El lab esta probado para java 8 en adelante
Hola buenas, una pregunta Emmanuel ¿Dónde tienes el método GetAccountInfo?
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.
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.
No, no es un método predeterminado, es una método propio del API del ejemplo que estoy consumiendo, puede escribirme a oracle.max.consultor@gmail.com
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.