4.1 El método send(), BodyHandlers
Ha terminado de aprender cómo formar una solicitud http , por lo que puede pasar a lo más importante: enviar esta solicitud. En el caso más simple, esto es fácil de hacer:
HttpRequest request = HttpRequest.newBuilder(new URI("https://codegym.cc")).build();
HttpClient client = HttpClient.newBuilder()
.version(Version.HTTP_1_1)
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.statusCode() );
System.out.println(response.body() );
¿Y cuáles BodyHandlers
son estos? ¿Qué opinas? Enviaste una solicitud, lo que significa que deberías recibir una respuesta: http response
. Y esta respuesta puede tener response body
: una cadena, un archivo, una matriz de bytes, un InputStream.
Sí, sí, así es. Al igual que cuando se forma una solicitud, debe especificar el tipo response body
de respuesta. Puede haber 8 piezas en total:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Según el tipo que BodyHandlers
haya pasado al método send()
, devolverá ese tipo de resultado. Ejemplo:
// response body is ignored
HttpResponse<Void> response = client.send(request, BodyHandlers.discarding());
// response body is a string
HttpResponse<String>response = client.send(request, BodyHandlers.ofString());
// response body is a file
HttpResponse<Path> response = client.send(request, BodyHandlers.ofFile(Paths.get("readme.txt")));
// response body is an InputStream
HttpResponse<InputStream> response = client.send(request, BodyHandlers.ofInputStream());
Si se le debe enviar un archivo como respuesta, BodyHandlers.ofFile()
debe pasar el nombre del archivo local al método, donde el objeto HttpClient lo guardará.
4.2 método followRedirects()
301
Además, al enviar una solicitud, puede especificar qué debe hacer HttpClient si el servidor envía o 302
(redireccionamiento temporal o permanente) en respuesta . Imagine que el servidor ha enviado un código 302
y necesita: realizar un seguimiento de esta situación, obtener una nueva URL de la respuesta y enviar la solicitud a la nueva dirección.
No me gustaría mucho hacer esto, especialmente teniendo en cuenta que esta situación es común y se ha automatizado durante mucho tiempo en todos los clientes http. Además, en este HttpClient solo necesita especificar qué modo de redirección elige al enviar la solicitud.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Solo hay 3 opciones para una redirección:
- SIEMPRE - siempre;
- NUNCA - nunca;
- NORMAL - siempre, excepto HTTPS -> HTTP.
Como puede ver, no hay muchas opciones aquí, pero siempre es mejor tener la capacidad de personalizar que no tenerla.
4.4 El método proxy()
Hay un par de opciones más útiles, pero que no se usan con frecuencia. No los necesitas exactamente hasta que los necesitas :)
El primero es proxy. En la vida cotidiana, no los encuentra a menudo, pero muchas grandes corporaciones tienen un complejo sistema de seguridad de tráfico de Internet en su interior y, por lo tanto, varias configuraciones de proxy.
Bueno, por supuesto, su software, que funcionará en algún lugar de las entrañas de tal corporación, algún día se encontrará con el hecho de que necesitará usar un proxy. Por lo tanto, es bueno que esa opción también esté aquí.
Configurar un proxy es muy simple: un ejemplo:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
El proxy predeterminado se ha elegido aquí, pero es posible que desee configurar el suyo propio:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
No consideraremos cómo trabajar exactamente con un proxy, ya que esto no está incluido en el alcance de este curso.
4.5 autenticador()
Y un punto más importante. El protocolo HTTP admite la autenticación. Justo a nivel de protocolo.
Ahora este enfoque casi no se usa, pero hace unos 20 años era común. La solicitud Http se veía así:
http://username@example.com/
O incluso así:
http://username:password@example.com/
Esto no es correo. Este es exactamente el enlace. Y sí, no lo creías así. El inicio de sesión e incluso la contraseña se pueden especificar directamente en la solicitud http. Sí, incluso ahora puedes. Por eso escribo que ahora nadie suele hacer esto. Pero existe tal posibilidad.
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"username",
"password".toCharArray());
}
};
HttpResponse<String> response = HttpClient.newBuilder()
.authenticator(auth).build()
.send(request, BodyHandlers.ofString());
¡Esto es interesante! ¿Sabes por qué en lugar de “password"
en el código dice "password".toCharArray()
?
Porque el segundo parámetro del constructor PasswordAuthentication
no es String
, sino CharArray
.
¿Y por qué el segundo parámetro no lo es String
, eh CharArray
?
Porque no se permite que todas las contraseñas se almacenen como una cadena completa por motivos de seguridad, incluso en su propia aplicación . Es decir, su aplicación en su memoria no debe almacenar la contraseña como una cadena. De modo que si alguien hizo una memoria húmeda, no se pudo extraer la contraseña ...
Pero al mismo tiempo, la contraseña se puede transmitir a través de un protocolo HTTP inseguro en medio mundo :) :) :)
Bien. El mundo no es perfecto.
Puedes leer más sobre este tema en los siguientes enlaces:
GO TO FULL VERSION