Rest Client 🌐
O MicroProfile Rest Client fornece uma maneira para invocarmos serviços RESTful sobre HTTP. O MicroProfile Rest Client tenta usar APIs Jakarta RESTful Web Services 2.1 para manter compatibilidades e melhorar as questões de reuso.
Para criar um projeto Quarkus com suporte ao Rest Cliente utilize o seguinte comando:
mvn io.quarkus.platform:quarkus-maven-plugin:2.5.1.Final:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=service \
-DclassName="dev.rpmhub.Client" \
-Dpath="/client" \
-Dextensions="resteasy,resteasy-jackson,rest-client,rest-client-jackson"
cd client
Note que as extensões rest-client
e rest-client-jackson
(JSON binding) foram adicionadas ao projeto.
Implementação 🛠️
Imagine que temos que nos comunicar um um RESTful Web Service de um carrinho de compras (checkout) em um serviço de pagamento (payment):
Figura 1 - Diagrama de sequência de um carrinho de compras.
Para criarmos um Rest Client que se comunique com o serviço de pagamento temos que primeiro declarar uma interface, assim, observe o trecho de código abaixo:
@RegisterRestClient(baseUri = "https://localhost:8444/")
@AccessToken
public interface IPayment {
@POST
@Path("/payment")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
Invoice confirmPayment(
@FormParam("cardNumber") String cardNumber,
@FormParam("value") String value);
}
}
Na declaração da interface, temos que registrar nosso Rest cliente no CDI (Contexts and Dependency Injection) por meio da anotação @RegisterRestClient
. Logo, podemos indicar a URL base do serviço que iremos nos comunicar usando o atributo baseUri
.
Alternativamente, também podemos definir a URL base do serviço por meio de uma propriedade do arquivo application.properties. Nesse caso, temos que utilizar o seguinte formato:
{nome da classe com o pacote}/mp-rest/url={url base}
Depois disso, note que a declaração dos métodos da interface do cliente é bastante parecido com o método do serviço que desejamos nos comunicar.
Finalmente, para utilizarmos o nosso Rest Cliente utilizamos a injeção de dependência em um bean, por exemplo:
@Inject
@RestClient
IPayment paymentService;
Exemplo de Código 💡
Um exemplo de código bastante simples (serviço e Rest client) pode ser acessado por intermédio do Github:
git clone -b dev https://github.com/rodrigoprestesmachado/pw2
# Serviço de checkout
code pw2/exemplos/store/checkout
# Serviço de pagamento
code pw2/exemplos/store/payment
Exercício Prático 🏋️
O exercício trata-se de uma rede social para troca de livros, onde os usuários podem listar os livros que estão dispostos a emprestar e também solicitar empréstimos de outros usuários. O sistema é composto por dois serviços separados: um serviço que agrega informações sobre os livros que os usuários disponibilizam para empréstimo e outro serviço que gerencia os empréstimos. O objetivo é configurar a comunicação entre esses dois serviços usando MicroProfile Rest Client.
Serviço 1: Catálogo de Livros
O objetivo é criar um serviço que gerencie o catálogo de livros que os usuários disponibilizam para empréstimo. O serviço deve ter operações para:
-
Adicionar um livro ao catálogo
-
Consultar o catálogo de livros disponíveis
-
Marcar um livro como emprestado e devolvido
Serviço 2: Serviço de Gerenciamento de Empréstimos
O objetivo é criar um serviço que gerencie os empréstimos de livros entre os usuários. O serviço deve ter operações para:
-
Registrar um novo empréstimo
-
Listar os livros que podem ser emprestados
Quando um usuário solicita um empréstimo, o serviço de gerenciamento de empréstimos deve verificar se o livro está disponível no catálogo de livros e marcá-lo como emprestado. Neste sentido, um Rest Client deve ser utilizado para comunicar com o serviço de catálogo de livros.
A Figura 2 apresenta um diagrama de sequência que ilustra a comunicação entre os serviços.
Figura 2 - Diagrama de sequência do exercício.
Testes e Integração
-
Teste individualmente cada serviço para garantir que as operações de empréstimo e consulta de livros estão funcionando corretamente.
-
Após testar individualmente, integre os serviços e verifique se a comunicação entre eles está funcionando adequadamente para realizar operações de empréstimo e consulta de livros.
Referências 📚
-
Alex Soto Bueno; Jason Porter; Quarkus Cookbook: Kubernetes-Optimized Java Solutions. Editora: O’Reilly Media, 2020.
-
SmallReye Metrics. Disponível em: https://quarkus.io/guides/rest-client
CC BY 4.0 DEED