DEV Community

Cover image for  Http Client Api Java 11
Daiene Lima
Daiene Lima

Posted on

Http Client Api Java 11

Tem muito tempo que os desenvolvedores java sofrem para trabalhar com HTTP, se não fosse por meio de recursos externos essa solicitação ficava muito verbosa e cansativa.

Mas nas ultimas release do java tivemos a inclusão da Api cliente padronizada que visa substituir o HttpURLConnection que está presente no JDK desde os primeiros anos.

A nova Api suporta HTTP/1.1 e HTTP/2. A versão mais recente do protocolo HTTP foi projetada para melhorar o desempenho geral do envio de solicitações e do recebimento de respostas de um servidor.
Isso aconteceu através da introdução de varias alterações como:
multiplexação de fluxo, compactação de cabeçalho e Push Promise.
Além disso o novo HTPP suporta nativamente webSockets.

Ao contrário do HttpURLConnection, o HttpClient fornece mecanismos de solicitação síncrona e assíncrona.

A API consiste em 3 classes principais:

  • HttpRequest - representa a solicitação a ser enviada por meio do HttpClient
  • HttpClient - se comporta como um contêiner para informações de configuração comuns a várias solicitações
  • HttpResponse - representa o resultado de uma chamada HttpRequest

Um exemplo simples

var url = "https://postman-echo.com/get";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .GET()
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.send(request, HttpResponse.BodyHandlers.ofString());
return  response.body();
Enter fullscreen mode Exit fullscreen mode

Configurando Headers

Podemos usar o headers que recebe vários parâmetros ou header
que recebe apenas um parâmetro ambos os métodos são chave e valor.

        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .header("Content-Type", "text/plain;charset=UTF-8")
                .GET()
                .build();
Enter fullscreen mode Exit fullscreen mode
//varios headers
.headers("Content-Type", "application/json", "token", "dadda")
//apenas um header
.header(Content-Type", "application/json")
Enter fullscreen mode Exit fullscreen mode

Requisição com corpo

A nova API fornece várias implementações de BodyProcessor prontas para usar, que simplificam a passagem do corpo da solicitação.

  • StringProcessor - (lê o corpo de uma String , criada com HttpRequest.BodyProcessor.fromString )
  • InputStreamProcessor - (lê o corpo de um InputStream , criado com HttpRequest.BodyProcessor.fromInputStream )
  • ByteArrayProcessor - (lê o corpo de uma matriz de bytes, criada com HttpRequest.BodyProcessor.fromByteArray )
  • FileProcessor - (lê o corpo de um arquivo no caminho fornecido, criado com HttpRequest.BodyProcessor.fromFile )
var url = "https://postman-echo.com/post";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .POST(HttpRequest.BodyPublishers.ofString("exemplo"))
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.send(request, HttpResponse.BodyHandlers.ofString());

        return  response.body();
Enter fullscreen mode Exit fullscreen mode

O client suporta todos os métodos HTTP, mas o construtor contém apenas esses métodos pré-definidos: GET(), POST(), DELETE(), e PUT(). Para criar uma solicitação com um método HTTP diferente, você precisa chamar method().

    var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/headers"))
            .method("HEAD", BodyPublishers.noBody())
            .build();
Enter fullscreen mode Exit fullscreen mode

Configurações disponíveis

    var client = HttpClient.newBuilder()
            .authenticator(Authenticator.getDefault())
            .connectTimeout(Duration.ofSeconds(30))
            .cookieHandler(CookieHandler.getDefault())
            .executor(Executors.newFixedThreadPool(2))
            .followRedirects(Redirect.NEVER)
            .priority(1) 
            .proxy(ProxySelector.getDefault())
            .sslContext(SSLContext.getDefault())
            .version(HttpClient.Version.HTTP_2) 
            .sslParameters(new SSLParameters())
            .build();
Enter fullscreen mode Exit fullscreen mode

Por padrão, o cliente tenta abrir uma conexão HTTP / 2, se o servidor responder com HTTP / 1.1, o cliente retorna automaticamente para esta versão.

connectTimeout() - determina quanto tempo o cliente espera até que uma conexão possa ser estabelecida. Se a conexão não puder ser estabelecida, o cliente lançará uma HttpConnectTimeoutExceptionexceção.

executor() - define o executor a ser usado para tarefas assíncronas e dependentes.

Alguns dos métodos fornecidos na interface HttpResponse.

  • body() - retorna o corpo da resposta
  • headers() - retorna os cabeçalhos de resposta
  • statusCode() - retorna o código de status HTTP
  • version() - retorna o protocolo HTTP

Solicitações assíncrona

O novo HttpClient oferece duas possibilidades para enviar uma solicitação a um servidor:

  • send de forma síncrona (bloqueia até que a resposta chegue)
  • sendAsync de forma assíncrona (não espera pela resposta, sem bloqueio)

o método sendAsync retorna CompletableFeature - para processar uma solicitação de forma assíncrona :

var url = "https://postman-echo.com/post";
        HttpRequest request = HttpRequest.newBuilder()
                .uri(new URI(url))
                .POST(HttpRequest.BodyPublishers.ofString("exemplo"))
                .build();

        HttpClient httpClient = HttpClient.newHttpClient();
        var response =
                httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println);
        return response;
Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
gabrielsantosba profile image
Gabriel Bahia.

Muito Bom Daiene

Collapse
 
bernardo300 profile image
Bernardo Lopes

Obrigado por isso, tive contato essa semana com essa forma de buscar informações em outros serviços e confesso que foi muito bom encontrar resposta para minhas duvidas aqui