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:
Reutilização de Código: Métodos default
permitem compartilhar implementação entre várias classes que implementam a interface.
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:
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.
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 ✓.