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):

Carrinho de compras
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.

Biblio
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 📚

Rodrigo Prestes Machado
CC BY 4.0 DEED

Copyright © 2024 RPM Hub. Distributed by CC-BY-4.0 license