menu
Adianti Framework
menu Menu
Serviços REST no Adianti Framework 7 Pablo Dall'Oglio ( 2018-11-14)
Durante o desenvolvimento de um sistema, é comum termos de disponibilizar algumas de suas rotinas para que estas sejam executadas por aplicativos externos. O caminho mais utilizado é por meio de Web Services, e REST é um dos meios para se obter isto. Imagine que você desenvolveu um sistema, e agora precisa que outros sistemas possam consultar informações a respeito de seus objetos. Nesta seção, veremos como disponibilizar o acesso a objetos por meio de Web Services. Para tal, trabalharemos com a classe de Contatos, e criaremos um Web Service para manipulá-los.

Habilitando o servidor


O primeiro passo é habilitar um servidor REST no Adianti Framework. Para tal, se sua aplicação é baseada no Template, este arquivo já é fornecido, e basta renomear o arquivo rest.php.dist para rest.php e o servidor estará no ar.

Como este arquivo disponibiliza as classes do Framework para utilização externa, é imprescindível implementar um mecanismo de controle, ou seja, filtrar somente as requisições válidas. Para tal, foi colocado ali no arquivo um lembrete (// aqui implementar mecanismo de controle). Em próximos artigos do fórum, abordaremos segurança.

Classe de modelo


Antes de disponibilizar um serviço, é necessário termos a classe de entidade previamente declarada na pasta app/model ou em algum subdiretório. Se você já usa o Framework, provavelmente já tem várias classes de modelo.


app/model/Contact.php
  1. <?php
  2. class Contact extends TRecord
  3. {
  4.     const TABLENAME 'contact';
  5.     const PRIMARYKEY'id';
  6.     const IDPOLICY =  'max'// {max, serial}
  7.     
  8.     public function __construct(4691 NULL$callObjectLoad TRUE)
  9.     {
  10.         parent::__construct(4691$callObjectLoad);
  11.         parent::addAttribute('name');
  12.         parent::addAttribute('email');
  13.         parent::addAttribute('number');
  14.         parent::addAttribute('address');
  15.         parent::addAttribute('notes');
  16.     }
  17. }
  18. ?>


Criando a classe de serviço


Provavelmente você já tem uma série de classes de modelo representando suas tabelas na pasta app/model. Agora, queremos criar um Web Service para disponibilizar uma API para manipular uma classe de modelo. Para tal, precisamos criar uma classe de serviço. Uma classe de serviço cria uma camada que interage com uma funcionalidade interna da aplicação e a expõe para o mundo externo. Neste caso, vamos criar a classe app/service/ContactService.php. É necessário configurar ainda a constante DATABASE com o nome do conector de base de dados (existente em app/config/contacts.ini), e a constante ACTIVE_RECORD para conter o nome da classe de modelo (existente em app/model/Contact.php) que será disponibilizada. Ao usarmos a classe AdiantiRecordService como base (herança), a classe de serviço já herdará uma série de métodos REST como: load(), store(), delete(), loadAll(), e deleteAll().

app/service/ContactRestService.php
  1. <?php
  2. class ContactRestService extends AdiantiRecordService
  3. {
  4.     const DATABASE      'contacts';
  5.     const ACTIVE_RECORD 'Contact';
  6. }
  7. ?>


Preparando os testes


Para preparar os testes, precisaremos de uma função para realizar POST’s para uma URL do sistema. Para tal, vamos criar uma função chamada request(), que receberá a localização do serviço no primeiro parâmetro, o método de envio (POST), e um vetor com os dados da postagem no segundo parâmetro. Esta função de testes está no link a seguir.

request.php
https://pastebin.com/jmXjD1pw


Carregar registro


Para carregar um registro, realizamos um request (GET) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (load), e o id do registro a ser carregado.

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']  = 'ContactRestService';
  9.     $parameters['method'] = 'load';
  10.     $parameters['id']     = '1';
  11.     print_r(request($location'GET'$parameters));
  12. }
  13. catch (Exception $e)
  14. {
  15.     echo 'Error: '$e->getMessage();
  16. }
  17. ?>


O registro será retornado na forma de objeto.


Retorno:
stdClass Object ( [id] => 1 [name] => Mary [email] => mary@mary.com [number] => +55 (51) 1234-5678 [address] => Mary Street, 123, Philadephia [notes] => Good customer )



Criar registro


Para criar um registro, realizamos um request (POST) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (store), e o vetor com os dados a serem gravados (data). Cada posição do vetor de dados conterá um atributo a ser armazenado na tabela. Como não estamos informando o id, a classe realizará um insert.

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']  = 'ContactRestService';
  9.     $parameters['method'] = 'store';
  10.     $parameters['data']   = ['name'    => 'Dino',
  11.                              'email'   => 'dino@email.com',
  12.                              'number'  => '12345678',
  13.                              'address' => 'Dino St, 123'];
  14.     
  15.     print_r(request($location'POST'$parameters));
  16. }
  17. catch (Exception $e)
  18. {
  19.     echo 'Error: '$e->getMessage();
  20. }
  21. ?>


O registro será retornado na forma de objeto, com o id gerado.

Retorno:
stdClass Object ( [name] => Dino [email] => dino@email.com [number] => 12345678 [address] => Dino St, 123 [id] => 5 )


Alterar registro


Para alterar um registro, realizarmos um request (POST) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (store), e o vetor com os dados a serem gravados (data), a alteração ocorre pois o id é informado. Caso contrário, é criado um novo registro.

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']  = 'ContactRestService';
  9.     $parameters['method'] = 'store';
  10.     $parameters['data']   = ['name' => 'Dino Sauro''id' => 3];
  11.     
  12.     print_r(request($location'POST'$parameters));
  13. }
  14. catch (Exception $e)
  15. {
  16.     echo 'Error: '$e->getMessage();
  17. }
  18. ?>


O retorno terá um objeto com os dados informados.

Retorno:
stdClass Object ( [name] => Dino Sauro [id] => 3 )


Excluir registro


Para excluir um registro, realizarmos um request (POST) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (delete), e o id a ser excluído.

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']  = 'ContactRestService';
  9.     $parameters['method'] = 'delete';
  10.     $parameters['id']     = 3;
  11.     request($location'POST'$parameters);
  12. }
  13. catch (Exception $e)
  14. {
  15.     echo 'Error: '$e->getMessage();
  16. }
  17. ?>


Carregar vários registros


Para listar todos os registros, realizarmos um request (GET) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (loadAll), e os possíveis filtros da consulta na forma de array (filters).

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']   = 'ContactRestService';
  9.     $parameters['method']  = 'loadAll';
  10.     // $parameters['filters'] = [ ['id', '>', 1] ];
  11.     
  12.     print_r(request($location'GET'$parameters));
  13. }
  14. catch (Exception $e)
  15. {
  16.     echo 'Error: '$e->getMessage();
  17. }
  18. ?>


O retorno será um vetor de objetos.

Retorno:
Array ( [0] => stdClass Object ( [name] => Mary [email] => mary@mary.com [number] => +55 (51) 1234-5678 [address] => Mary Street, 123, Philadephia [notes] => Good customer [id] => 1 ) [1] => stdClass Object ( [name] => John [email] => john@mail.com [number] => +55 (51) 1234-5678 [address] => Jon Street, 123, Philadelphia [notes] => Good customer [id] => 2 ) ...


Excluir vários registros


Para excluir vários registros, realizarmos um request (POST) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (deleteAll), e os filtros com os registros a serem excluídos (filters).

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     
  7.     $parameters = [];
  8.     $parameters['class']   = 'ContactRestService';
  9.     $parameters['method']  = 'deleteAll';
  10.     $parameters['filters'] = [ ['id''>'3] ];
  11.     
  12.     print_r(request($location'POST'$parameters));
  13. }
  14. catch (Exception $e)
  15. {
  16.     echo 'Error: '$e->getMessage();
  17. }
  18. ?>


Executando um método próprio


Nem sempre os métodos básicos (load, store, delete) são suficientes. Existem situações, onde é necessário disponibilizar um método personalizado com alguma regra de negócio diferenciada. Nestes casos, podemos criar e disponibilizar um método próprio da classe de serviço. Neste caso, vamos criar um método chamado getBetween() que receberá dois parâmetros: from e to, e deverá retornar todos os registros entre esses dois códigos.

app/service/ContactRestService.php
  1. <?php
  2. class ContactRestService extends AdiantiRecordService
  3. {
  4.     const DATABASE      'contacts';
  5.     const ACTIVE_RECORD 'Contact';
  6.     
  7.     public static function getBetween$request )
  8.     {
  9.         TTransaction::open('contacts');
  10.         $response = array();
  11.         
  12.         // carrega os contatos
  13.         $all Contact::where('id''>='$request['from'])
  14.                       ->where('id''<='$request['to'])
  15.                       ->load();
  16.         foreach ($all as $product)
  17.         {
  18.             $response[] = $product->toArray();
  19.         }
  20.         TTransaction::close();
  21.         return $response;
  22.     }
  23. }
  24. ?>


No exemplo a seguir, veremos como consumir o método próprio. Para tal, realizarmos um request (GET) para o REST Server (rest.php), identificando a classe de serviço (ContactRestService), o método (getBetween), e os parâmetros (from, to) necessários. O retorno será na forma de um Array de objetos.

  1. <?php
  2. require_once 'request.php';
  3. try
  4. {
  5.     $location 'http://localhost/contacts/rest.php';
  6.     $parameters = array();
  7.     $parameters['class']      = 'ContactRestService';
  8.     $parameters['method']     = 'getBetween';
  9.     $parameters['from']       = '1';
  10.     $parameters['to']         = '3';
  11.     
  12.     print_r(request($location'GET'$parameters));
  13. }
  14. catch (Exception $e)
  15. {
  16.     echo 'Error: '$e->getMessage();
  17. }
  18. ?>




Comentários

 


Você precisa realizar login para enviar posts, comentários, dentre outros. Para isso, clique em um dos botões a seguir para logar utilizando a API de um dos serviços.