2
respostas

[Dúvida] ClientHttpConfiguration - criação da instância do client

Olá! Venho com outro questionamento/sugestão.
Dentro da classe ClientHttpConfiguration, não seria interessante instanciar o client "globalmente" para ser utilizado por ambos métodos de disparar requisição, ao invés de criá-los separadamente em cada método?
Eu me perguntei se por se tratarem de verbos HTTP distintos pudesse gerar algum erro, no entanto ao testar na minha aplicação funcionou.
Criá-los dentro de cada método seria para evitar a criação dessa instância automaticamente ao rodar a aplicação? Ou teria alguma outra explicação para essa escolha?

Abaixo exemplo de como ficou minha classe de gerenciamento de requisições.

package br.com.alura.client;

import com.google.gson.JsonObject;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ClientHttpConfig {
    HttpClient client = HttpClient.newHttpClient();
    public HttpResponse<String> dispararReqGet(String uri) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(uri))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();
        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }

    public HttpResponse<String> dispararReqPost(String uri, JsonObject json) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(uri))
            .header("Content-Type", "application/json")
            .method("POST", HttpRequest.BodyPublishers.ofString(json.toString()))
            .build();

        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }
}
2 respostas

Olá, Pamela! Tudo bem?

Instanciar o HttpClient globalmente na classe ClientHttpConfiguration pode ser uma boa prática, especialmente se você está usando o mesmo HttpClient para múltiplas requisições dentro da mesma aplicação. Isso pode ajudar a economizar recursos e melhorar a eficiência, já que o HttpClient é projetado para ser reutilizável e thread-safe.

No seu caso, já que você mencionou que testou e funcionou, é provável que não haja problemas em ter uma única instância do HttpClient para diferentes métodos HTTP, como GET e POST. Isso está de acordo com o princípio de reutilização de objetos e pode simplificar seu código.

A escolha de instanciar o HttpClient dentro de cada método pode ser feita para garantir que cada requisição tenha um novo cliente, mas como o HttpClient é thread-safe, essa abordagem geralmente não é necessária. Além disso, criar o HttpClient globalmente pode ajudar a evitar a criação desnecessária de instâncias, o que pode ser mais eficiente em termos de desempenho.

Veja como poderia ficar a sua classe com o HttpClient instanciado globalmente:

package br.com.alura.client;

import com.google.gson.JsonObject;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ClientHttpConfig {
    private final HttpClient client = HttpClient.newHttpClient();

    public HttpResponse<String> dispararReqGet(String uri) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(uri))
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();
        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }

    public HttpResponse<String> dispararReqPost(String uri, JsonObject json) throws IOException, InterruptedException {
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(uri))
            .header("Content-Type", "application/json")
            .method("POST", HttpRequest.BodyPublishers.ofString(json.toString()))
            .build();
        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }
}

Ao fazer isso, você mantém o código mais limpo e eficiente. No entanto, sempre é bom testar em diferentes cenários para garantir que essa abordagem atende a todas as suas necessidades.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Quando entrei no tópico de testes unitários, ter instanciado o HttpClient globalmente quebrou os testes, visto que gerou mais uma dependência.
Acho que talvez poderia ter instanciado ele globalmente dentro do AbrigoServiceTest e testado, mas optei por voltar a instânciar dentro de cada método.
Não tenho certeza de qual abordagem seria a melhor, no fim das contas. Ou se "daria no mesmo", em relação a quantidade de instâncias.