Ejemplo con el cliente HTTP/2 de Java

Escrito por el .
blog-stack java planeta-codigo programacion
Comentarios

Java

Otra de las nuevas funcionalidades incluidas en Java 9 aunque en modo incubación 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 jdk.incubator.httpclient.

 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 jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpClient.Redirect;
import jdk.incubator.http.HttpClient.Version;
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpResponse;
import jdk.incubator.http.HttpResponse.BodyHandler;

public class Main {

    public static void main(String... args) throws Exception {
        HttpClient client = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.SECURE).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(), BodyHandler.asString());

        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());
    }
}
1
2
3
module blogbitix.http {
    requires jdk.incubator.httpclient;
}
Petición con el cliente de Java para HTTP/2

Otras fomas 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, no seguirlas o solo si son seguras o utilizan el mismo protocolo.

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.

Para ejecutar el ejemplo usando Gradle y Java 9 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()
    }
}

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 el comando ./gradlew run.