En el post anterior vimos como consumir una API desde C#. Ahora lo haremos con Java y OkHttp, un cliente HTTP que es muy eficiente y que ofrece:
- La compatibilidad con HTTP/2 permite que todas las solicitudes al mismo host compartan un socket.
- La agrupación de conexiones reduce la latencia de las solicitudes (si HTTP/2 no está disponible). GZIP transparente reduce el tamaño de las descargas.
- El almacenamiento en caché de respuestas evita por completo que la red reciba solicitudes repetidas.
Además de seguir especificaciones HTTP modernas como:
- Semántica HTTP - RFC 9110.
- Almacenamiento en caché HTTP - RFC 9111
- HTTP/1.1 - RFC 9112
- HTTP/2 - RFC 9113
- WebSockets - RFC 6455
- SSE - Eventos enviados por el servidor.
1. Comencemos creando el proyecto con Maven:
$ mvn archetype:generate \ -DgroupId=com.inforhomex.app \ -DartifactId=proyecto \ -DarchetypeArtifactId=maven-archetype-quickstart \ -DarchetypeVersion=1.4 \ -DinteractiveMode=false
Nos posicionamos en el directorio creado y modificamos la clase principal.
App.java
package com.inforhomex.app; import okhttp3.*; import java.io.IOException; import static java.lang.System.out; import static java.lang.System.err; /** * @author Codemonkey Junior */ public class App { public static final String URL_STRING = "http://localhost:3000/api/saludo"; public static void main(String[] args) { out.println("\t [ Consumiendo una API con okhttp ]"); hacerPeticionEnApi(args); } private static void hacerPeticionEnApi(String... args){ OkHttpClient client = new OkHttpClient(); HttpUrl.Builder urlBuilder = HttpUrl.parse(URL_STRING).newBuilder(); urlBuilder.addQueryParameter("id", "765421"); final String finalUrl = urlBuilder.build().toString(); Request.Builder requestBuilder = new Request.Builder() .url(finalUrl).method("GET", null) .addHeader("application-name", "application-java"); Request request = requestBuilder.build(); try(Response response = client.newCall(request).execute()){ out.println(response.code()); if(response.body() != null){ out.println(response.body().string()); }else{ out.println("La respuesta es: null"); } }catch(IOException ioex){ err.printf("Excepcion: %s\n", ioex.getMessage()); } } }
En esta clase creamos un cliente gracias a la librería okhttp3 y en específico a la clase ``OkHttpClient``. Indicamos la URL del servicio (hecho en Node JS). Indicamos el valor a mandar (id) y el nombre de la aplicación en las cabeceras (header).
Compilamos la aplicación:
$ mvn clean compile
Reusaremos el servicio creado en el post anterior.
index.js
import express from 'express'; const app = express(); const port = 3000; // Parsear JSON app.use(express.json()); app.get('/', (req, res) => { res.send('Hola, mundo desde Node JS y Express.'); }); app.get('/api/saludo', (req, res) => { const id = req.query.id || 'desconocido'; const appName = req.headers['application-name'] || 'sin nombre'; res.json({ mensaje: `¡Hola! Recibí tu ID: ${id}`, origen: `Aplicación: ${appName}` }); }); app.listen(port, () => { console.log(`Escuchando desde el puerto: http://localhost:${port}`); });
Ejecutamos el proyecto node e iniciará el servicio en la url: http://localhost:3000
$ npm start
Ejecutamos la aplicación Java con Maven, pero antes debemos hacer unos ajustes al ``pom.xml``
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.inforhomex.app</groupId> <artifactId>proyecto-okhtpp</artifactId> <version>1.0</version> <name>proyecto-okhtpp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.release>17</maven.compiler.release> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.junit</groupId> <artifactId>junit-bom</artifactId> <version>5.11.0</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp-bom</artifactId> <version>5.2.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <scope>test</scope> </dependency> <!-- Optionally: parameterized tests support --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.squareup.okhttp/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp-jvm</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>mockwebserver3</artifactId> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>logging-interceptor</artifactId> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.4.0</version> <configuration> <mainClass>com.inforhomex.app.App</mainClass> </configuration> </plugin> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.4.0</version> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.3.0</version> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.4.2</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>3.1.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>3.1.2</version> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.12.1</version> </plugin> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>3.6.1</version> </plugin> </plugins> </pluginManagement> </build> </project>
Esto nos permitirá agregar las librerías y ejecutar la aplicación con Maven:
$ mvn exec:java
Si todo es correcto, veremos en consola el resultado:
[ Consumiendo una API con okhttp ] 200 {"mensaje":"¡Hola! Recibí tu ID: 765421","origen":"Aplicación: application-java"}
¡Hemos consumido un servicio Node JS con Java y la librería okhttp!
Más ejemplos en próximas entregas.
Enlaces:
https://square.github.io/okhttp/
No hay comentarios:
Publicar un comentario