Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida

Se eu fizer uma Interface de services com metodos default e implementar nas classes de servico a interface estaria correto ou estaria mal implementado?

public interface Services {

    default HttpResponse<String> requisicaoGet(@NotNull HttpClient client, 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());
    }

    default HttpResponse<String> requisicaoPost(@NotNull HttpClient client, 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());
    }
}
1 resposta
solução!

Fala Luccas! Joia?

Você está no caminho certo ao pensar em usar uma interface com métodos default para centralizar as requisições HTTP. No entanto, é importante considerar algumas boas práticas e princípios de design de software, como os princípios SOLID.

Prós e Contras de Métodos default em Interfaces

Prós:

  1. Reutilização de Código: Métodos default permitem compartilhar implementação entre várias classes que implementam a interface.

  2. Facilidade de Manutenção: Alterações na implementação dos métodos default se propagam automaticamente para todas as classes que implementam a interface.

Contras:

  1. Responsabilidade Única: Colocar lógica de requisição HTTP em uma interface de serviços pode violar o princípio da responsabilidade única (Single Responsibility Principle - SRP) do SOLID. A interface Services estaria assumindo a responsabilidade de fazer requisições HTTP, além de definir o contrato dos serviços.

  2. Dificuldade de Testes: Métodos default em interfaces podem ser mais difíceis de testar isoladamente.

Alternativa: Classe Utilitária ou Serviço Dedicado

Para manter seu código mais alinhado com as boas práticas, você pode criar uma classe dedicada para lidar com as requisições HTTP. Isso segue a sugestão do exercício de criar uma classe ClientHttpConfiguration. Veja como poderia ser:

public class ClientHttpConfiguration {

    private final HttpClient client;

    public ClientHttpConfiguration() {
        this.client = HttpClient.newHttpClient();
    }

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

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

Usando a Classe ClientHttpConfiguration em Serviços

Agora, você pode usar essa classe em seus serviços (AbrigoService e PetService) sem duplicar código:

public class AbrigoService {

    private final ClientHttpConfiguration clientHttpConfiguration;

    public AbrigoService(ClientHttpConfiguration clientHttpConfiguration) {
        this.clientHttpConfiguration = clientHttpConfiguration;
    }

    public void listarAbrigo() throws IOException, InterruptedException {
        String uri = "http://localhost:8080/abrigos";
        HttpResponse<String> response = clientHttpConfiguration.requisicaoGet(uri);
        // Processar a resposta...
    }

    public void cadastrarAbrigo(JsonObject json) throws IOException, InterruptedException {
        String uri = "http://localhost:8080/abrigos";
        HttpResponse<String> response = clientHttpConfiguration.requisicaoPost(uri, json);
        // Processar a resposta...
    }
}

Separar a lógica de requisição HTTP em uma classe dedicada ajuda a manter seu código mais limpo e modular, seguindo os princípios do SOLID. Isso facilita a manutenção, testes e evolução do seu código.

Espero ter ajudado e bons estudos!

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