Función de cliente HTTP/2 de Java 9 con ejemplo

Cliente HTTP/2: El cliente HTTP/2 es una de las características de JDK 9 . HTTP/2 es la versión más reciente del Protocolo HTTP . Con la ayuda del cliente HTTP/2, desde la aplicación Java, podemos enviar la solicitud HTTP y podemos procesar la respuesta HTTP. Antes de JDK 9, para enviar una solicitud HTTP y procesar la respuesta HTTP, usamos la clase HttpURLConnection . Ahora se preguntará por qué se introdujo el cliente HTTP/2 en JDK 9 cuando tenemos HttpURLConnection para resolver el propósito. Pero la HttpURLConnection existente tiene algunos problemas que se eliminan en el cliente HTTP/2.

Algunos problemas importantes con HttpURLConnection:

  1. La clase HttpURLConnection solo admite el protocolo HTTP/1.1 pero no el protocolo HTTP/2.0. Un protocolo no es más que un conjunto de reglas o procedimientos para transmitir datos entre dispositivos electrónicos, como computadoras. HTTP significa Protocolo de transferencia de hipertexto y aquí Protocolo significa protocolo de comunicación de datos utilizado para establecer la comunicación entre el cliente y el servidor. Como la clase HttpURLConnection solo admite HTTP/1.1, es por eso que si usamos la clase HttpURLConnection, podemos enviar solo una solicitud por conexión TCP. Esto causará tráfico de red y problemas de rendimiento para la aplicación. Como HttpURLConnection solo admite HTTP/1.1, solo puede procesar datos de texto, no datos binarios .
  2. La clase HttpURLConnection solo funciona en modo síncrono . El modo síncrono significa que tenemos que esperar a que la solicitud termine su tarea antes de enviar otra solicitud. Si usamos la clase HttpURLConnection para procesar requests HTTP, debemos permanecer inactivos hasta que obtengamos la respuesta de la solicitud, luego podemos procesar otra solicitud HTTP, lo que causará un problema de rendimiento.

Ventajas del cliente HTTP/2.0:

  1. El cliente HTTP/2.0 es muy liviano y fácil de usar. El cliente HTTP/2.0 admite HTTP/1.1 y HTTP/2.0 . HTTP/2 se centra en cómo se enmarcan y transportan los datos entre el servidor y el cliente. En HTTP/1.1, no podemos tener más de seis conexiones abiertas a la vez, por lo que cada solicitud debe esperar a que las demás se completen. La solución del problema anterior es la multiplexación en el cliente HTTP/2. Esto significa que, con la ayuda de HTTP/2, puede enviar varias requests HTTP en paralelo a través de una única conexión TCP.
  2. En HTTP/1.1, cuando enviamos una solicitud HTTP que contiene la información del encabezado, HTTP/1.1 considera los datos de los encabezados como datos adicionales, lo que aumenta el ancho de banda. Esto se puede eliminar en HTTP/2.0 usando HPack para la compresión de encabezados.
  3. El cliente HTTP/2.0 admite datos de texto y binarios para su procesamiento.
  4. El cliente HTTP/2.0 funciona tanto en modo síncrono como asíncrono. . El cliente HTTP/2.0 ofrece un rendimiento mucho mejor en comparación con HttpURLConnection.

HTTP API en Java 9: ​​En Java 9 se introdujo una nueva API que es fácil de usar y que también agrega soporte para HTTP/2. Hay 3 nuevas clases introducidas para manejar la comunicación HTTP. Estas tres clases están presentes dentro del módulo jdk.incubator.httpclient y el paquete jdk.incubator.http dentro del módulo. Como jdk.incubator.httpclient no está presente dentro de la aplicación java, tenemos que importarlo explícitamente dentro del archivo module-info.java.

  1. HttpClient: HttpClient es un contenedor de información de configuración común a varias HttpRequests. Todas las requests se envían a través de un HttpClient. HttpClients son inmutables y se crean a partir de un constructor devuelto por newBuilder(). Los generadores de requests se crean llamando a HttpRequest.newBuilder().
  2. HttpRequest: HttpRequest representa una solicitud HTTP que se puede enviar a un servidor. Las requests HTTP se crean a partir de los constructores de HttpRequest. Los constructores de HttpRequest se obtienen llamando a HttpRequest.newBuilder. Se pueden configurar el URI, los encabezados y el cuerpo de una solicitud. Los cuerpos de solicitud se proporcionan a través de HttpRequest. Objeto BodyProcessor proporcionado a los métodos DELETE, POST o PUT. GET no toma un cuerpo. Una vez que se han establecido todos los parámetros necesarios en el generador, se llama a HttpRequest.Builder.build() para devolver HttpRequest.
  3. HttpResponse: una HttpResponse está disponible cuando se han recibido el código de estado de la respuesta y los encabezados y, por lo general, después de que también se haya recibido el cuerpo de la respuesta.

Ejemplo:

Proyecto ficticio de HTTP/2.0: Como ya sabemos que no podemos usar las API internas directamente en Java 9, tenemos que crear una entrada en el archivo descriptor del módulo. Aquí para usar la nueva API HTTP que está presente dentro del módulo jdk.incubator.httpclient . Tenemos que mencionarlo dentro del archivo descriptor del módulo. Tenemos que seguir los pasos a continuación para realizar una operación usando HTTP/2 en Java 9:-

  • Primero cree una carpeta con el nombre src, es decir, la carpeta fuente de nuestro programa java y dentro de esa carpeta con el nombre geeks, que contendrá la información de metadatos y cree una carpeta más dentro de geeks con el nombre httpPackage, que no es más que el nombre del paquete donde colocaremos nuestro código java.
  • Cree module-info.java directamente dentro de geeks como se muestra a continuación:

    module geeks
    {
        requires jdk.incubator.httpclient;
    }
  • Cree la clase java dentro de la carpeta httpPackage con el nombre Geeksforgeeks.java y con la implementación como se muestra a continuación:

    package httpPackage;
    import java.io.IOException;
    import java.net.URI;
    import jdk.incubator.http.HttpClient;
    import jdk.incubator.http.HttpRequest;
    import jdk.incubator.http.HttpResponse;
      
    public class Geeksforgeeks {
        public static void main(String[] args)
        {
            try {
                // Create a HttpClient
                HttpClient httpClient
                    = HttpClient.newHttpClient();
      
                // create a HttpRequest object with the URL
                HttpRequest httpRequest
                    = HttpRequest
                          .newBuilder()
                          .uri(new URI("https:// www.geeksforgeeks.org/about/"))
                          .GET()
                          .build();
                // Synchronous send() method
                // to process the HTTP request.
                // HttpResponse.BodyHandler.asString() handles
                // the body of the response as a String.
                HttpResponse<String> httpResponse
                    = httpClient.send(
                        httpRequest,
                        HttpResponse.BodyHandler.asString());
      
                // statusCode() returns the status code
                // for this response.
                System.out.println(
                    "Status of operation performed:"
                    + httpResponse.statusCode());
            }
            catch (Exception e) {
                System.out.println("Exception" + e);
            }
        }
    }
  • Para compilar nuestro código java, tenemos que ir a la carpeta src y ejecutar el siguiente comando:
    javac --module-source-path src-d-out -m geeks
  • Para ejecutar nuestro código java, tenemos que ejecutar el siguiente comando:
    java --module-path out -m geeks/httpPackage.Geeksforgeeks

    Producción:

    WARNING: using incubator modules jdk.incubator.httpclient
    Status of operation performed:200
    
  • Desde el programa anterior, podemos enviar una solicitud HTTP GET a través del método de envío sincrónico() y manejar la respuesta como una string. Supongamos que no queremos esperar hasta que se complete la solicitud HTTP y queremos enviar otra solicitud HTTP en paralelo y también queremos guardar la respuesta en un archivo. En el ejemplo anterior, estamos usando la función síncrona que se bloqueará hasta que se complete. Podemos hacerlo asíncrono y guardar la respuesta en el archivo.

    import java.nio.file.Paths;
    import java.io.IOException;
    import java.net.URI;
    import jdk.incubator.http.HttpClient;
    import jdk.incubator.http.HttpRequest;
    import jdk.incubator.http.HttpResponse;
      
    public class Geeksforgeeks {
        public static void main(String[] args)
        {
            try {
                // Create a HttpClient
                HttpClient httpClient
                    = HttpClient.newHttpClient();
      
                // create a HttpRequest object with the URL
                HttpRequest httpRequest
                    = HttpRequest
                          .newBuilder()
                          .uri(new URI("https:// www.geeksforgeeks.org/about/"))
                          .GET()
                          .build();
      
                // Synchronous send() method
                // to process the HTTP request.
                // HttpResponse.BodyHandler.asFile(Paths.get("GFG.html"))
                // save the response body into GFG.html file
                HttpResponse<String> httpResponse
                    = httpClient.send(
                        httpRequest,
                        HttpResponse.BodyHandler.asFile(Paths.get("GFG.html")));
      
                // statusCode() returns the status code for this response.
                System.out.println(
                    "Status of operation performed:"
                    + httpResponse.statusCode());
      
                // body() returns the response of HTTP request
                System.out.println("Response body:"
                                   + httpResponse.body());
            }
            catch (Exception e) {
                System.out.println("Exception" + e);
            }
        }
    }

    Producción:

    WARNING: using incubator modules jdk.incubator.httpclient
    Status of operation performed:200
    Response body: It will return the source code of https://www.geeksforgeeks.org/about/ page. As the response is too big i am not adding in it here.
    

Publicación traducida automáticamente

Artículo escrito por Bishal Kumar Dubey y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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