Serviços RESTful no Adianti Framework 7 No artigo anterior (https://www.adianti.com.br/forum/pt/view_4691), vimos como criar um serviço REST. Agora vamos proceder com a criação de um serviço RESTful. 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.di...
No artigo anterior (https://www.adianti.com.br/forum/pt/view_4691), vimos como criar um serviço REST. Agora vamos proceder com a criação de um serviço RESTful.
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).
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.
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().
Para cada classe de serviço a ser disponibilizada, devem ser criadas três rotas. A primeira é usada para operações com objetos individuais como um GET ou PUT para /contacts/1, já a segunda é usada para ações personalizadas sobre objetos individuais como /contacts/1/action, e a terceira é usada para operações em lote como um GET ou POST para /contacts. Para cada nova classe de serviço criada, você deve replicar essas três linhas, substituindo "contacts" do primeiro segmento pelo nome do objeto manipulado, e "ContactRestService" do segundo segmento pelo nome da classe de serviço a ser disponibilizada.
Para preparar os testes, precisaremos de uma função para realizar requisições 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 no segundo parâmetro (GET, POST, PUT, DELETE), e um vetor com os dados da postagem no terceiro parâmetro. Esta função de testes está no link a seguir.
request.php
https://pastebin.com/jmXjD1pw
Carregar registro em PHP
Para carregar um registro em PHP, realizamos um request do tipo GET para a URL contendo o endpoint com o registro a ser consultado /contacts/<id>.
stdClass Object
(
[id] => 1
[name] => Mary
[email] => mary@mary.com
[number] => +55 (51) 1234-5678
[address] => Mary Street, 123 Philadephia
[notes] => Good customer
)
Carregar registro em Javascript
Para carregar um registro em Javascript, realizamos um request do tipo GET para a URL contendo o endpoint com o registro a ser consultado /contacts/<id>.
Para carregar um registro em Shell, realizamos um request do tipo GET para a URL contendo o endpoint com o registro a ser consultado /contacts/<id>.
curl -i -X GET http://localhost/sistema/contacts/1
O retorno será um objeto com os dados.
Retorno
HTTP/1.1 200 OK
{"status":"success","data":{"id":"1","name":"Mary","email":"mary@mary.com","number":"+55 (51) 1234-5678","address":"Mary Street, 123 Philadephia","notes":"Good customer"}}
Criar registro em PHP
Para criar um registro em PHP, realizamos um request do tipo POST para a URL contendo o endpoint /contacts, identificando no terceiro parâmetro o vetor com os dados do objeto.
Para criar um registro em Javascript, realizamos um request do tipo POST para a URL contendo o endpoint /contacts, identificando os dados do objeto na posição data.
Para criar um registro em Shell, realizamos um request do tipo POST para a URL contendo o endpoint /contacts, identificando os dados do objeto no parâmetro “-d”.
HTTP/1.1 200 OK
{"status":"success","data":{"name":"Dino","email":"dino@email.com","id":5}}
Alterar registro em PHP
Para alterar um registro em PHP, realizamos um request do tipo PUT para a URL contendo o endpoint /contacts/<id>, identificando os dados para alteração do objeto no terceiro parâmetro.
Para alterar um registro em Javascript, realizamos um request do tipo PUT para a URL contendo o endpoint /contacts/<id>, identificando os dados para alteração do objeto no parâmetro data.
Para alterar um registro em Shell, realizamos um request do tipo PUT para a URL contendo o endpoint /contacts/<id>, identificando os dados para alteração do objeto no parâmetro “-d”.
Para carregar vários registros em PHP, realizamos um request do tipo GET para a URL contendo o endpoint /contacts, identificando no terceiro parâmetro ordem, limit e filtros.
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
)
...
Carregar vários registros em Javascript
Para carregar vários registros em Javascript, realizamos um request do tipo GET para a URL contendo o endpoint /contacts, identificando parâmetros como ordem, limit e filtros.
Para carregar vários registros em Shell, realizamos um request do tipo GET para a URL contendo o endpoint /contacts, identificando no argumento “-d” parâmetros como ordem, limit e filtros.
Para excluir vários registros em PHP, realizamos um request do tipo DELETE para a URL contendo o endpoint /contacts, identificando no terceiro parâmetro os filtros.
Para excluir vários registros em Javascipt, realizamos um request do tipo DELETE para a URL contendo o endpoint /contacts, identificando no parâmetro data, os filtros.
Para excluir vários registros em Shell, realizamos um request do tipo DELETE para a URL contendo o endpoint /contacts, identificando no argumento “-d”, os filtros.
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 um método próprio da classe de serviço. Neste caso, vamos criar um método chamado name() que retornará o nome do registro solicitado. Claro que isso não é necessário pois o GET já carrega o objeto inteiro, mas podemos realizar outras operações mais complexas também.
No exemplo a seguir, vemos como consumir o método. Para tal, realizamos um request GET para a URL contendo o registro a ser manipulado /contacts/<id>/metodo.
E se eu precisar mudar algo em algum das funções? Não consigo sobreescrever nenhuma delas sem usar direto a classe direto do adianti.
ML
Matheus Lima
27/06/2019 (há 5 anos)
Existe algum exemplo de como fazer as chamadas com GET com filtro, e POST em Typescript ?
FS
Fabiano R. da Silva
06/07/2020 (há 4 anos)
Olá, pessoal.
O arquivo .htaccess precisa ficar na mesma pasta do arquivo rest.php?
RA
Ricardo Assis
02/03/2021 (há 4 anos)
Olá Pessoal, como eu altero um registro com json puro para o Adianti, enviado por exemplo do postman ou insomina. O serviço rest do adianti não é padrão json ?
Como implementar basic authentication?
E se eu precisar mudar algo em algum das funções? Não consigo sobreescrever nenhuma delas sem usar direto a classe direto do adianti.
Existe algum exemplo de como fazer as chamadas com GET com filtro, e POST em Typescript ?
Olá, pessoal.
O arquivo .htaccess precisa ficar na mesma pasta do arquivo rest.php?
Olá Pessoal, como eu altero um registro com json puro para o Adianti, enviado por exemplo do postman ou insomina. O serviço rest do adianti não é padrão json ?
Exemplo abaixo, verbo POST:
Retorno:
Não funciona, esta fazendo o insert e estou chamando o update (store) com id
o que tem de errado nesse request ?