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 BodyHandlersesses? 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 bodyde 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 BodyHandlersvocê 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()

301Alé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 302e 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:

Autenticação HTTP

Compreendendo a autenticação HTTP