Novo HttpClient

All lectures for PT purposes
Nível 1 , Lição 365
Disponível

1.1 Introdução ao HttpClient

A partir do JDK 11, os desenvolvedores da plataforma Java adicionaram uma nova ferramenta poderosa ao JDK para fazer solicitações http, o java.net.http. Ele contém quatro classes principais:

  • HttpClientName
  • HttpRequest
  • HttpResponse
  • soquete da web

Essas são classes muito poderosas que permitem executar todos os tipos de solicitações possíveis usando o HTTP, HTTP/2e WebSocket.

Além disso, você pode usar essas classes para fazer solicitações http síncronas e assíncronas.

Fazer uma solicitação http consiste nas seguintes partes:

  1. Criar um objetoHttpClient
  2. Criar um objetoHttpRequest
  3. Enviando uma solicitação usando o método send()ousendAsync()
  4. Processamento de respostaHttpResponse

Um exemplo desse pedido:


 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 Abordagem declarativa

No exemplo acima, você vê um exemplo da chamada abordagem declarativa para escrever código. Vamos dar uma olhada na primeira parte do exemplo:


 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();

Como seria esse código escrito em estilo clássico:


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());

Ao usar a abordagem declarativa no código, duas coisas mudam. Em primeiro lugar , todos os métodos de classe HttpClient retornam seu próprio objeto , o que permite organizar o código na forma de cadeias.

Código clássico:

HttpClient client = HttpClient.new();
client.setVersion(Version.HTTP_1_1);
client.setFollowRedirects(Redirect.NORMAL);
client.setConnectTimeout(Duration.ofSeconds(20));
client.setAuthenticator(Authenticator.getDefault());
Em cadeia:

HttpClient client = HttpClient.new() .setVersion(Version.HTTP_1_1) .setFollowRedirects(Redirect.NORMAL). setConnectTimeout(Duration.ofSeconds(20)) .setAuthenticator(Authenticator.getDefault());
Transferimos cada método para uma linha separada (esta é uma instrução longa)

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Em segundo lugar , o prefixo foi removido dos métodos set, o que permite que você escreva o código de forma ainda mais compacta:

Era

HttpClient client = HttpClient.new()
.setVersion(Version.HTTP_1_1)
.setFollowRedirects(Redirect.NORMAL)
.setConnectTimeout(Duration.ofSeconds(20))
.setAuthenticator(Authenticator.getDefault());

Tornou-se

HttpClient client = HttpClient.new()
.version(Version.HTTP_1_1)
.followRedirects(Redirect.NORMAL)
.connectTimeout(Duration.ofSeconds(20))
.authenticator(Authenticator.getDefault());
    

Esse código é mais fácil de ler, embora mais difícil de escrever.

E mais um ponto importante. Neste exemplo, o padrão Builder foi usado. Existem cenários em que criar um objeto é um processo complexo. Portanto, eles preferem formalizá-lo: começa com uma chamada de método condicional begin()e termina com uma chamada de método condicional end().

No exemplo que analisamos, o método HttpClient.newBuilder()retorna um objeto HttpClient.Builder(essa é uma classe utilitária interna da classe HttpClient). Todos os métodos do tipo version()são chamados apenas neste objeto de serviço. Bom, a chamada do método build()marca o fim da construção do objeto e retorna o objeto HttpClient.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION