APIs RESTful com Delphi e DataSnap – Parte IV

APIS RESTful com Delphi e DataSnap - DevSpace
APIS RESTful com Delphi e DataSnap

Última atualização em 2 de setembro de 2022 por Willian Tuttoilmondo

Recapitulando

Nos episódios anteriores, vimos como criar, implementar, disponibilizar e testar APIs RESTful com Delphi e DataSnap. Em cada uma dessas etapas trabalhamos com um aspecto do nosso projeto, como sua concepção, arquitetura, implementação do código, tratamento básico de erros, deploy e testes. Agora chegou a hora de vermos como podemos ampliar nossa API através da implementação de novas classes, assim como implementar a aceitação de um novo método HTTP para a execução de métodos em nossa API.

Como estamos na parte IV de nosso artigo, é interessante estar a par das partes anteriores. Se esta é a primeira leitura da série, recomento que você volte até o início de tudo, onde definimos a arquitetura utilizando padrões de projeto, os quais são a base desse projeto. Se você já nos acompanha há algum tempo, vamos seguir em frente e ver como essa arquitetura pode realmente facilitar nossa vida e proporcionar inúmeras vantagens para nossos projetos futuros.

APIs RESTful com Delphi e DataSnap – Adicionando classes ao projeto

Como temos uma estrutura estabelecida de classes que foram utilizadas em nosso projeto, usamos como base uma Abstract Factory que instancia objetos derivados da classe TOperacao: TSoma, TSubtracao, TMultiplicacao e TDivisao. Como implementação adicional, criaremos duas novas classes: TPotenciaTRaiz. Com elas será possível efetuar os cálculos de ab e b√a. Estes são cálculos aritméticos simples, portanto, sem muitos problemas a serem desenvolvidos em nossa API. Abaixo é possível ver o código destas duas classes:

Como vimos, a implementação destas classes é extremamente simples, assim como as demais classes do projeto, mas na classe TRaiz temos um truque matemático. Como não temos um método nativo que calcule b√a, precisamos nos valer de sua equivalência matemática. Como aprendemos lá atrás, ainda na escola, um número x elevado a uma potência 1/y (x1/y) é equivalente a y√x, o que resolve nosso problema. Sendo assim, a linha Result := Power(A, 1/B); nos trará o resultado da raiz b de a.

Criadas e salvas as classes, basta adicioná-las ao projeto – uma vez que elas só serão registradas na Abstract Factory se isso for feito – e recompilá-lo para que estas classes passem a fazer parte da nossa API. Para atualizar nosso módulo no servidor Apache, antes de disponibilizar o novo arquivo em sua estrutura, é preciso parar o servidor. Através da tela inicial do Laragon, se você seguiu os passos do artigo anterior, basta clicar em Parar e aguardar que todos os serviços agregados parem. Assim que isto acontecer, basta substituir o arquivo do módulo pelo novo arquivo compilado e comandar novamente o início dos serviço para ver a mágica acontecer.

APIs RESTful com Delphi e Datasnap - Postman - Teste de raiz
APIs RESTful com Delphi e Datasnap – Postman – Teste de raiz

Após realizarmos a atualização do nosso módulo, efetuamos o teste do cálculo da raiz 5 de 32 (5√32) através da rota https://localhost/api/dscalculator/v1/raiz?a=32&b=5, o que nos trouxe um resultado igual a 2, uma vez que 25 é igual a 32, o que pode ser comprovado pela nossa API através da rota https://localhost/api/dscalculator/v1/potencia?a=2&b=5.

Adicionando novos métodos HTTP à API

Segundo a norma RFC 7231, nós temos à nossa disposição outros métodos HTTP além do método GET que podem ser utilizados, sendo os principais: POSTPUTPATCHDELETE. Através deles é possível identificar qual operação será realizada em uma API sem a necessidade de descrevê-la em sua rota. Com base nesta mesma norma, podemos entender que utilizaremos:

  • GET quando estamos pesquisando itens em nossa API ou executando operações que permitam uma URI que não ultrapassem o limite de 256 caracteres;
  • POST quando queremos incluir um item em nossa API ou executando operações complexas onde o limite de 256 caracteres da URI é ultrapassado;
  • PUT quando queremos substituir completamente um item em nossa API;
  • PATCH quando queremos atualizar algumas informações em um item de nossa API e;
  • DELETE quando queremos excluir um ou mais itens de nossa API.

Sendo assim vamos, apenas a título de entendimento, adicionar o método HTTP POST à nossa API para entendermos como trabalharemos com outros métodos além de GET. Para podermos começar, vamos implementar um método restrito ao método WebModule1DefaultHandlerAction chamado DoPOSTOperation.

Com este método implementado, podemos realizar uma rápida alteração no método WebModule1DefaultHandlerAction.

Sendo assim, nossa unit WebModule.Container fica com o seguinte código:

Testando a nova implementação

Com a conclusão desta etapa, podemos testar seu funcionamento. Como sugeri no artigo anterior, para o teste dos outros métodos que utilizaremos além do método GET, precisaremos usar o Postman, o qual pode ser obtido aqui. Como os demais testes que demonstrei aqui foram realizados com ele, o próximo também será. Como implementamos o método POST em nossa API, neste teste, a rota fica um pouco diferente.

APIs RESTful com Delphi e Datasnap - Postman - Teste de POST
APIs RESTful com Delphi e Datasnap – Postman – Teste de POST

Agora, para a utilização pelo método POST, nossa rota é mais curta, terminando no nome da classe (https://localhost/api/dscalculator/v1/raiz). Contudo, para que esta rota seja válida, precisamos indicar que o método utilizado é o POST, como pode ser visto na imagem, e precisamos adicionar um corpo à requisição, o qual indicamos na aba Body, selecionando a opção raw e indicando o Content-Type como JSON. Além disso, o objeto JSON nesta requisição deve obedecer certos padrões que são requisitos de nossa API. Para isso, ele deve:

  • conter os nós b e;
  • os nós ab devem conter valores numéricos.

Ao enviarmos o objeto JSON à API, esta faz validações básicas, como a consistência do objeto em si, a existência dos nós requeridos e se o valor destes é numérico. Assim como fizemos nos primeiros testes, vou colocar no objeto JSON um nó com valor não-numérico e enviá-lo à API. Se tudo correr bem, ela tratará o erro e nos devolverá uma mensagem amigável como retorno.

APIs RESTful com Delphi e Datasnap - Postman - Teste de erro POST
APIs RESTful com Delphi e Datasnap – Postman – Teste de erro POST

Próximos passos

Nesta etapa encerramos o desenvolvimento de APIs RESTful com Delphi e DataSnap. Este é um trabalho inacabado, uma vez que, propositalmente, alguns pontos do código, apesar de funcionais, podem ser melhorados em aspectos de boas práticas e princípios de Clean Code. Futuramente discutiremos estes assuntos, trazendo uma abordagem mais profunda destas melhorias utilizando o código deste projeto como base.

Espero que vocês tenham gostado do resultado final e que possam, de hoje em diante, repensar a forma como se desenvolvem novas aplicações. Um abraço e até o próximo artigo!

Ah, e o código fonte deste projeto pode ser baixado, na íntegra, aqui!

Sobre Willian Tuttoilmondo 12 Artigos
Arquiteto de software com mais de 25 anos de experiência em desenvolvimento de software, especialista em desenvolvimento multicamadas utilizando Embarcadero Delphi e NodeJS para o back-end e o próprio Delphi para o front-end. Usuário Linux desde 1998, é evangelista PostgreSQL, banco de dados no qual é especialista. Ocupa hoje a posição de arquiteto de software na TOTVS, a maior empresa de tecnologia do Brasil, além de ser sócio fundador da LT Digital Labs, empresa especializada em desenvolvimento e treinamentos.

3 Comentários

1 Trackback / Pingback

  1. Construindo APIs RESTful nível 3 com Delphi e Datasnap

Faça um comentário

Seu e-mail não será publicado.


*