CONSTRUINDO APLICAÇÕES RESTful
Arquitetura REST, RMM e HATEOAS
por Ricardo Plansky
QUEM SOU EU
Ricardo Plansky - Analista Desenvolvedor @ Leroy Merlin Brasil
- Formado em Análise e Desenvolvimento de Sistemas
- 09 anos de experiência com programação
- 07 anos com PHP OO
- Áreas: Marketing Digital, Business Intelligence, Telecom e, agora, e-commerce varejista.
AGENDA
- O que é REST
- Como funciona este modelo
- Quais são as restrições
- O que é RESTful
- Richardson Maturity Model
- Níveis do RMM
- HATEOAS
- JSON SCHEMA
- CONSIDERAÇÕES FINAIS
O QUE É REST
Modelo de Arquitetura criado por Roy Fielding em meados de 2000 em sua tese de Doutorado
COMO FUNCIONA ESTE MODELO
Conjunto de regras de arquitetura para aplicações web
REGRAS
1) Client-Server
REGRAS
1) Client-Server
- Evolução independente dos ambientes
- Separação de responsabilidades
- Recursos divididos
REGRAS
2) Stateless
REGRAS
2) Stateless
- Toda requisição deve ser independente
- Os servidores não devem guardar estados dos seus clients
- O client deve mandar toda informação necessária para o servidor entender e processar a requisição
REGRAS
3) Cacheable
REGRAS
3) Cacheable
- Evitar processamento desnecessário
- Ganho de performance
- Tempo de resposta para os clients
- Menor uso de recursos do servidor
REGRAS
4) Uniform Interface
REGRAS
4) Uniform Interface
- Contrato de comunicação entre cliente e servidor
- Coesão em endpoints e respostas
- Estrutura clara de organização
- RMM
- HATEOAS
REGRAS
5) Layered System
REGRAS
5) Layered System
- Clientes não se comunicam diretamente com servidores
- Camada de abstração
- Load Balancer
- Escalabilidade
REGRAS
6) Code-on-Demand
REGRAS
6) Code-on-Demand
(opcional)
- Execução de código do lado do cliente
- Necessidades variantes de acordo com o cliente
- JavaScript, Applets, Flash, etc.
O QUE É RESTful
1) Seguir estritamente as regras do modelo de arquitetura REST (com exceção da 6 que é opcional)
2) Possuir um certo nível de coesão e maturidade
RICHARDSON MATURITY MODEL
- Um modelo simples que define o nível de 'maturidade' RESTful da sua app.
- Possui 3 níveis (mais o nível zero)
- Aplicado basicamente na quarta regra do REST (Uniform Interface)
RMM - Nível 0
É a ausência de qualquer regra.
- Basicamente usar o HTTP como transporte de informações
- Possui apenas um endpoint e um verbo HTTP
- Comum em SOAP
RMM - Nível 0 - Exemplo
POST http://api.meetuplaravelsp.com/call{
"action": "createUser",
"parameters": {
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating"]
}
}{
"action": "deleteUser",
"parameters": {
"username": "rplansky"
}
}{
"action": "removeHobbie",
"parameters": {
"username": "rplansky",
"hobbie": "football"
}
}RMM - Nível 0 - Exemplo
<?php
class MagicController
{
public function call($action, array $parameters = array())
{
switch ($action) {
case 'createUser':
// Some code
break;
case 'deleteUser':
// Some code
break;
case 'removeHobbie':
// Some code
break;
...
}
}
}RMM - Nível 1
Aplicação de resources
- São criadas diversos endpoints para representar os resources
- Melhor estruturação
RMM - Nível 1 - Exemplo
POST http://api.meetuplaravelsp.com/user/create{
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating"]
}POST http://api.meetuplaravelsp.com/user/delete{
"username": "rplansky"
}RMM - Nível 1 - Exemplo
POST http://api.meetuplaravelsp.com/user/rplansky/hobbie/remove{
"hobbie": "football"
}RMM - Nível 1 - Exemplo
class UserController
{
public function create($parameters)
{
// Some code
}
public function delete($username)
{
// Some code
}
}class HobbieController
{
public function remove($username, $hobbie)
{
// Some code
}
}RMM - Nível 2
Aplicação de verbos HTTP
- Além dos endpoints criados no nível 1, agora há coesão entre verbos e ações executadas
RMM - Nível 2 - Exemplo
POST http://api.meetuplaravelsp.com/user{
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating"]
}DELETE http://api.meetuplaravelsp.com/user/rplansky{
}DELETE http://api.meetuplaravelsp.com/user/rplansky/hobbie/football{
}RMM - Nível 3
HATEOAS
Hypermedia As The Engine Of Application State
HATEOAS
É prover uma maneira do cliente interagir com o serviço inteiramente por hipermídia.
Deixar claro como é feita a comunicação com os seus recursos e fornecer as informações necessárias para isso
HATEOAS
GET http://api.meetuplaravelsp.com/{
"name": "Meetup Laravel SP API",
"version": "1.4-beta",
"_links": [
{
"rel": "user",
"_links": [
{"rel": "create", "href": "/user", "method": "POST"},
{"rel": "delete", "href": "/user", "method": "DELETE"},
{"rel": "list", "href": "/user", "method": "GET"},
{"rel": "hobbie", "_links": [
...
]}
]
}
}
}HATEOAS
POST http://api.meetuplaravelsp.com/userPOST HTTP/1.1 201 Created
content-type:application/json; charset=UTF-8
date:Wed, 01 Apr 2015 18:06:36 GMT
status:201 Created
version:HTTP/1.1
Location: http://api.meetuplaravelsp.com/user/rplanskyHATEOAS
POST http://api.meetuplaravelsp.com/user{
"user": {
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating"]
},
"_links": [
{"rel": "self", "href": "/user/rplansky", "method": "GET"},
{"rel": "delete", "href": "/user/rplansky", "method": "DELETE"},
{"rel": "addHobbie", "href": "/user/rplansky/hobbie", "method": "POST"}
{"rel": "hobbies", "href": "/user/rplansky/hobbie", "method": "GET"}
]
}HATEOAS
POST http://api.meetuplaravelsp.com/user/rplansky/hobbie{
"user": {
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating", "new-hobbie"]
},
"_links": [
{"rel": "self", "href": "/user/rplansky/hobbie/new-hoobie", "method": "GET"},
{"rel": "delete", "href": "/user/rplanskyhobbie/new-hoobie", "method": "DELETE"},
{"rel": "list", "href": "/user/rplansky/hobbie", "method": "GET"}
]
}HATEOAS
GET http://api.meetuplaravelsp.com/user/page/2{
"page": 2,
"limit": 10,
"users": [
{
"username": "rplansky",
"password": "letmein",
"hobbies": ["football", "drawing", "skating", "new-hobbie"]
},
{...}
]
"_links": [
{"rel": "add", "href": "/user", "method": "POST"},
{"rel": "next", "href": "/user/page/3"},
{"rel": "prev", "href": "/user/page/1"},
]
}NÍVEL HARD
JSON SCHEMA
{
"title": "Example Schema",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": ["firstName", "lastName"]
}CONSIDERAÇÕES
- Utilizem o HEADER das requisições.
- Status Code de resposta
- Analise as respostas dos seus serviços. É coeso? Tem todas as informações necessárias para interação?
OBRIGADO!
PERGUNTAS?
CONTATO






Construindo Aplicações RESTful
By Ricardo Plansky Jr.
Construindo Aplicações RESTful
Slides da apresentação feita no Segundo Meetup de Laravel de SP, onde falo um pouco sobre o modelo de arquitetura REST e como construir uma aplicação RESTful apresentando os conceitos de Richardson Maturity Model e HATEOAS
- 387