1.1 Introducción a HttpClient
A partir de JDK 11, los desarrolladores de la plataforma Java agregaron una nueva y poderosa herramienta a JDK para realizar solicitudes http, el archivo java.net.http
. Contiene cuatro clases clave:
- Cliente Http
- Solicitud Http
- HttpRespuesta
- zócalo web
Estas son clases muy poderosas que le permiten realizar todos los tipos posibles de solicitudes utilizando los protocolos HTTP
, HTTP/2
y WebSocket
.
Además, puede utilizar estas clases para realizar solicitudes http sincrónicas y asincrónicas.
Hacer una solicitud http consta de las siguientes partes:
- Crear un objeto
HttpClient
- Crear un objeto
HttpRequest
- Envío de una solicitud mediante el método
send()
osendAsync()
- Procesamiento de respuestas
HttpResponse
Un ejemplo de tal solicitud:
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
1.2 Enfoque declarativo
En el ejemplo anterior, verá un ejemplo del llamado enfoque declarativo para escribir código. Veamos la primera parte del ejemplo:
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)))
.authenticator(Authenticator.getDefault())
.build();
Cómo se vería este código escrito en estilo clásico:
HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setProxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80)));
client.setAuthenticator(Authenticator.getDefault());
Cuando se utiliza el enfoque declarativo en el código, cambian dos cosas. En primer lugar , todos los métodos de clase HttpClient
devuelven su propio objeto , lo que le permite organizar el código en forma de cadenas.
Código clásico: |
---|
|
Como una cadena: |
|
Transferimos cada método a una línea separada (esta es una declaración larga) |
|
En segundo lugar , el prefijo se elimina de los métodos set
, lo que le permite escribir código de forma aún más compacta:
Era |
---|
|
Se convirtió |
|
Dicho código es más fácil de leer, aunque más difícil de escribir.
Y un punto más importante. En este ejemplo, se utilizó el patrón Builder. Hay escenarios en los que crear un objeto es un proceso complejo. Por lo tanto, prefieren formalizarlo: comienza con una llamada de método condicional begin()
y termina con una llamada de método condicional end()
.
En el ejemplo que analizamos, el método HttpClient.newBuilder()
devuelve un objeto HttpClient.Builder
(esta es una clase de utilidad interna de la clase HttpClient
). Todos los métodos del tipo version()
se llaman solo en este objeto de servicio. Bueno, la llamada del método build()
marca el final de la construcción del objeto y devuelve el objeto HttpClient
.
GO TO FULL VERSION