Ejemplo con el cliente HTTP/2 de Java

Escrito por picodotdev el , actualizado el .
java planeta-codigo programacion
Enlace permanente Comentarios

Java

Otra de las nuevas funcionalidades incluidas en Java 9 aunque en modo incubación e incorporado en Java 11 de forma estable es el cliente con soporte para HTTP/2 para realizar peticiones a recursos usando este protocolo más eficiente y rápido. Al mismo tiempo se ha simplificado el código necesario para realizar una petición y obtener el resultado de una URL. También se ha añadido la funcionalidad de realizar peticiones asíncronas y creación de conexiones de WebSockets.

Las clases importantes de esta nueva API con HttpClient, HttpRequest y HttpResponse. Estas clases se encuentran en el módulo de incubación jdk.incubator.httpclient, una vez que sea definitiva la API se renombrará el módulo.

El siguiente ejemplo realiza una petición a la página del buscador Google con unas cabeceras y obtiene el código de estado, las cabeceras devueltas y el cuerpo de la página de resultado. En la declaración del módulo para usar el cliente hay que indicar que tiene como requerimiento su módulo de java.net.http.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package io.github.picodotdev.blogbitix.http;

import java.net.URI;

import java.net.http.HttpClient;
import java.net.http.HttpClient.Redirect;
import java.net.http.HttpClient.Version;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;

public class Main {

    public static void main(String... args) throws Exception {
        HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2).build();

        HttpResponse<String> response = client.send(HttpRequest.newBuilder(new URI("https://www.google.es/")).headers("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0").GET().build(), HttpResponse.BodyHandlers.ofString());

        System.out.println("Status Code: " + response.statusCode());
        System.out.println("Headers:");
        response.headers().map().entrySet().forEach(System.out::println);
        System.out.println("Body:");
        System.out.println(response.body());
    }
}
Main.java
1
2
3
module blogbitix.http {
    requires java.net.http;
}
module-info.java

Petición con el cliente de Java para HTTP/2

Petición con el cliente de Java para HTTP/2

Otras formas de manejadores del resultado de la petición son los siguientes:

Se puede definir la política de cómo procesar las redirecciones para seguirlas o no seguirlas.

Y añadir trazas de las peticiones que se realicen con el cliente.

Con la clase SSLContext es posible establecer autenticación para el cliente usando un certificado como muestro en el artículo Autenticación mutua de cliente y servidor con certificados.

La ventaja del cliente HTTP incluido en el JDK es que no es necesario ninguna dependencia adicional en la aplicación, sin embargo es un cliente que require crear código de infraestructura para realizar las peticiones, recibir las respuestas y realizar las transformaciones de datos desde y a JSON. Otras alternativas permiten Crear de forma sencilla un cliente de un servicio REST o HTTP con Retrofit.

Para ejecutar el ejemplo usando Gradle y Java 11 hay que añadir un poco de configuración al script de construcción que posiblemente en un futuro no será necesaria cuando se mejore el soporte.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apply plugin: 'java'
apply plugin: 'application'

ext.moduleName = 'blogbitix.http'
mainClassName = "$moduleName/io.github.picodotdev.blogbitix.http.Main"

repositories {
    jcenter()
}

dependencies {
}

compileJava {
    inputs.property("moduleName", moduleName)
    doFirst {
        options.compilerArgs = [
            '--module-path', classpath.asPath,
        ]
        classpath = files()  
    }
}

run {
    inputs.property("moduleName", moduleName)
    doFirst {
        jvmArgs = [
            '--module-path', classpath.asPath,
            '--module', mainClassName 
        ]
        classpath = files()
    }
}
build.gradle
Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run

Comparte el artículo: