4.1 O método send(), BodyHandlers
Você terminou de aprender como formar uma solicitação http , então pode passar para a coisa mais importante - enviar esta solicitação. No caso mais simples, isso é fácil de fazer:
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() );
E quais são BodyHandlers
esses? O que você acha? Você enviou uma solicitação, o que significa que deve receber uma resposta - http response
. E esta resposta pode ter response body
: uma string, um arquivo, um array de bytes, um InputStream.
Sim, sim, isso mesmo. Assim como ao formar uma solicitação, você precisa especificar o tipo response body
de resposta. Pode haver 8 peças no total:
BodyHandlers.ofByteArray
BodyHandlers.ofString
BodyHandlers.ofFile
BodyHandlers.discarding
BodyHandlers.replacing
BodyHandlers.ofLines
BodyHandlers.fromLineSubscriber
Dependendo do tipo que BodyHandlers
você passou para o método send()
, ele retornará tal tipo de resultado. Exemplo:
// 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());
Se um arquivo deve ser enviado a você como resposta, BodyHandlers.ofFile()
você precisa passar o nome do arquivo local para o método, onde será salvo pelo objeto HttpClient.
4.2 método followRedirects()
301
Além disso, ao enviar uma solicitação, você pode especificar o que HttpClient deve fazer se o servidor enviar ou 302
(redirecionamento temporário ou permanente) em resposta . Imagine que o servidor enviou um código 302
e você precisa: rastrear essa situação, obter uma nova URL da resposta e enviar a solicitação para o novo endereço.
Eu não gostaria muito de fazer isso, especialmente considerando que essa situação é comum e há muito tempo automatizada em todos os clientes http. Também neste HttpClient você só precisa especificar qual modo de redirecionamento você escolhe ao enviar a solicitação.
HttpResponse response = HttpClient.newBuilder()
.followRedirects( HttpClient.Redirect.ALWAYS )
.build()
.send(request, BodyHandlers.ofString());
Existem apenas 3 opções para um redirecionamento:
- SEMPRE - sempre;
- NUNCA - nunca;
- NORMAL - sempre, exceto HTTPS -> HTTP.
Como você pode ver, não há muitas opções aqui, mas é sempre melhor ter a capacidade de personalizar do que não tê-la.
4.4 O método proxy()
Existem algumas opções mais úteis, mas não usadas com frequência. Você não precisa deles exatamente até precisar deles :)
O primeiro é proxy. Na vida cotidiana, você não os encontra com frequência, mas muitas grandes corporações possuem um complexo sistema de segurança de tráfego da Internet e, portanto, várias configurações de proxy.
Bem, é claro, seu software, que funcionará em algum lugar nas entranhas de tal corporação, um dia encontrará o fato de que precisará usar um proxy. Portanto, é bom que essa opção também esteja aqui.
Configurar um proxy é muito simples - um exemplo:
HttpResponse<String> response = HttpClient.newBuilder()
.proxy( ProxySelector.getDefault())
.build()
.send(request, BodyHandlers.ofString());
O proxy padrão foi escolhido aqui, mas você pode definir o seu próprio:
HttpResponse response = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.microsoft.com", 80)))
.build()
.send(request, BodyHandlers.ofString());
Como exatamente trabalhar com um proxy, não vamos considerar, pois isso não está incluído no escopo deste curso.
4.5 autenticador()
E mais um ponto importante. O protocolo HTTP suporta autenticação. Bem no nível do protocolo.
Agora essa abordagem quase não é usada, mas cerca de 20 anos atrás era comum. A solicitação Http ficou assim:
http://username@example.com/
Ou ainda assim:
http://username:password@example.com/
Isso não é correio. Este é exatamente o link. E sim, você não pensou assim. O login e até mesmo a senha podem ser especificados diretamente na solicitação http. Sim, mesmo agora você pode. É por isso que escrevo que ninguém costuma fazer isso agora. Mas existe essa possibilidade.
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());
Isto é interessante! Você sabe por que, em vez de “password"
no código, diz "password".toCharArray()
?
Porque o segundo parâmetro do construtor PasswordAuthentication
não é String
, mas CharArray
.
E por que o segundo parâmetro não é String
, hein CharArray
?
Porque todas as senhas não podem ser armazenadas como uma string inteira para fins de segurança, mesmo em seu próprio aplicativo . Ou seja, seu aplicativo em sua memória não deve armazenar a senha como uma string. Para que, se alguém fizesse memória úmida, a senha não pudesse ser extraída dela ...
Mas, ao mesmo tempo, a senha pode ser transmitida por meio de um protocolo HTTP inseguro em meio mundo :) :) :)
Bem. O mundo não é perfeito.
Você pode ler mais sobre esse assunto nos links abaixo:
GO TO FULL VERSION