Trabalho aprofundado sobre os princípios da arquitetura RESTful. Restrições do REST, Richardson Maturity Model, Implementação por meio de HTTP, Segurança, Cache, Versionamento, Rate Limit, Recomendação de boas práticas.
2. Pasqua Tecnologia - http://douglaspasqua.com 2
Palestrante
● Douglas Pasqua
– Desenvolvedor PHP / Java
– Especialista Linux
– Desde 2002
– LPIC-1, LPIC-2, PHP ZCE, Java
SCJP
– Instrutor e Palestrante
– http://douglaspasqua.com
3. Pasqua Tecnologia - http://douglaspasqua.com 3
O que é REST ?
● REpresentational State Transfer (Transferência de
Estado Representacional)
● É um estilo arquitetural para criação de aplicações
distribuídas
● Termo criado por Roy Fielding no ano de 2000 em
uma tese de Doutorado - “Architectural Styles and the
Design of Network-based Software Architectures”
● É totalmente independente do HTTP e da Web
● Sua utilização mais comum são APIs usando HTTP
4. Pasqua Tecnologia - http://douglaspasqua.com 4
Restrições do REST
1)Client-server
2)Stateless
3)Cache
4)Uniforme Interface
5)Layered System
6)Code-On-Demand (opcional)
5. Pasqua Tecnologia - http://douglaspasqua.com 5
1. Client-Server
● Objetivo é separar as duas arquiteturas
● Desenvolvimento dos dois são independentes
● Cliente não se preocupa com DB, log, cache, etc.
● Servidor não se preocupa com UX, etc.
6. Pasqua Tecnologia - http://douglaspasqua.com 6
2.Stateless
● Requisições devem ser
independentes
● O servidor não deve guardar
estado do cliente
● O estado deve ser gerenciado no
lado do cliente (sessions)
● Facilita design da arquitetura
● Facilita escalabilidade
● Facilita
monitoração/depuração
7. Pasqua Tecnologia - http://douglaspasqua.com 7
3.Cache
● Informar ao cliente se
os dados de uma
requisição podem ou
não ser guardados
em cache
● Melhorar:
● Escalabilidade
● Performance
8. Pasqua Tecnologia - http://douglaspasqua.com 8
4.Uniforme Interface
● Define interface entre
o cliente e servidor
● Simplifica e
desacopla a
arquitetura
● Permitindo as duas
partes evoluir
independentemente
1) Baseado em
Recursos
2) Representação do
Recurso
3)Mensagens auto
descritivas
4)Hypermedia
9. Pasqua Tecnologia - http://douglaspasqua.com 9
4.1. Baseado em Recursos
● Recursos individuais devem ser identificados
em requisições usando URIs específicas e
coesas.
http://api.example.net/cantor/michaeljackson
http://api.example.net/album/thisisit
10. Pasqua Tecnologia - http://douglaspasqua.com 10
4.2. Representação
● Define a foram como o recurso deve ser
retornado para o cliente
● JSON
● XML
● TXT
● HTML
● ...
11. Pasqua Tecnologia - http://douglaspasqua.com 11
4.3. Mensagens Auto descritivas
● Cada representação deve conter a informação
de como ela deve ser processada.
● Mime-types
● application/json
● application/xml
● text/plain
12. Pasqua Tecnologia - http://douglaspasqua.com 12
4.4. Hypermedia
● A representação deve fornecer “links” (body ou
headers) que permitem obter o próprio recurso
ou relacionados.
13. Pasqua Tecnologia - http://douglaspasqua.com 13
5. Layered System
● Sugere que o cliente não deve conectar diretamente
ao servidor, mas sim em um intermediador.
● Facilita escalabilidade, load-balacing, caches
compartilhados, etc.
14. Pasqua Tecnologia - http://douglaspasqua.com 14
6. Code on Demand
● Permite executar lógica no cliente, estendendo
e customizando o código do servidor
– Java applets
– Java script
– Etc.
● Restrição Opcional
15. Pasqua Tecnologia - http://douglaspasqua.com 15
Termo RESTful
● Termo RESTFul é usado para referenciar web
services que implementam a arquitetura REST
● Caso o serviço violar qualquer restrição não
pode ser considerado RESTful
16. Pasqua Tecnologia - http://douglaspasqua.com 16
Pontos Fortes
● Simplicidade
● Formatos de representação (JSON, XML, TXT,
etc.)
● JSON é enxuto, ideal para o mundo mobile
● Escalabilidade
● Cache
22. Pasqua Tecnologia - http://douglaspasqua.com 22
GET - Status Code
• 200 (OK)
• 404 (Not Found)
23. Pasqua Tecnologia - http://douglaspasqua.com 23
POST
● Usado para criação de novos recursos
● Deve retornar header “Location” com o link
para o novo recurso
● Não é uma operação “segura”
● Não é idempotente
25. Pasqua Tecnologia - http://douglaspasqua.com 25
POST - Exemplo (subordinado)
● POST http://api.example.net/singer/michaeljackson/music
{
"name":"Billie Jean",
"album":"Thriller",
"lancamento":"1982",
"letra":"Billie Jean is not my lover...",
"indicacoes":"Grammy Award, Cancao do Ano, etc."
}
26. Pasqua Tecnologia - http://douglaspasqua.com 26
POST - Status Code
● 201 Created (retornar Location)
● 400 Bad Request / 406 Not Acceptable
● 409 Conflict (registro duplicado)
27. Pasqua Tecnologia - http://douglaspasqua.com 27
PUT
● Recomendado para realização de atualizações
(updates)
● Permite-se usar PUT para criação de novos
recursos quando informado o ID pelo cliente
● Não é uma operação “segura”
● É idempotente
28. Pasqua Tecnologia - http://douglaspasqua.com 28
PUT - UPDATE
● PUT http://api.example.net/singer/michaeljackson
{
"name":"Michael Jackson",
"birthday":"1958-08-28",
"site":"michaeljackson.com",
"genres":[
"pop",
"rock",
"dance-pop"
]
}
Deve-se informar uma
nova representação do
recurso
29. Pasqua Tecnologia - http://douglaspasqua.com 29
PUT – Novo Recurso
● PUT http://api.example.net/singer/elvispresley
{
"name":"Elvis Presley",
"birthday":"1935-01-08",
"site":"www.elvis.com",
"genres":[
"pop",
"rock",
"blues"
]
}
Pode-se usar para
criar novos recursos
quando cliente informa
o ID
30. Pasqua Tecnologia - http://douglaspasqua.com 30
PUT – Status Code
● 200 OK / 204 No Content
● 404 Not Found
● 400 Bad Request / 406 Not Acceptable
31. Pasqua Tecnologia - http://douglaspasqua.com 31
PATCH
● Usado para modificação
● Contém apenas as mudanças e não a
representação completa do recurso
● Não é uma operação “segura”
● Não é idempotente
35. Pasqua Tecnologia - http://douglaspasqua.com 35
PATCH – Status Code
● 200 OK / 204 No Content
● 404 Not Found
● 400 Bad Request / 406 Not Acceptable
36. Pasqua Tecnologia - http://douglaspasqua.com 36
DELETE
● Usado para deletar um recurso
● Não é uma operação “segura”
● É idempotente
40. Pasqua Tecnologia - http://douglaspasqua.com 40
Richardson Maturity Model
● É uma maneira de graduar sua API de acordo
com as restrições do REST
● Quanto mais sua API aderir as restrições mais
pontuação ganha
● Desenvolvido por Leonard Richardson e
apresentando pela primeira vez na Qcon 2008
43. Pasqua Tecnologia - http://douglaspasqua.com 43
Segurança em APIs REST
● A solução não deve manter estado no lado do
servidor (Restrição Stateless)
● Não utilizar Sessions
44. Pasqua Tecnologia - http://douglaspasqua.com 44
Segurança em APIs REST
● Abordagens mais usadas
– Basic
– Digest
– OAuth
– JWT (Json Web Token)
45. Pasqua Tecnologia - http://douglaspasqua.com 45
Pontos a Considerar
● Cache
● Versionamento
● Limitar taxa de acesso
● Tratamento de erros
● Documentação
● Ferramentas de Apoio / Frameworks
46. Pasqua Tecnologia - http://douglaspasqua.com 46
Cache
● Ideal quando o servidor tiver que lidar com
grande volume de dados
● Usar em Operações GET
● Servidor deve usar Etag(hash) ou Last-
Modified para indicar que cache é possível
● O Cliente deve gerenciar os dados no cache
localmente
49. Pasqua Tecnologia - http://douglaspasqua.com 49
Versionamento
● Via URL
GET http://api.example.net/v2/singer/michaeljackson
● Custom Request Header
GET http://api.example.net/singer/michaeljackson
Api-version: 2
50. Pasqua Tecnologia - http://douglaspasqua.com 50
Versionamento
● Content type
GET http://api.example.net/singer/michaeljackson
Accept: application/vnd.api.example+json;version=2
51. Pasqua Tecnologia - http://douglaspasqua.com 51
Limitar taxa de acesso
● Quantidade de requisições X Tempo
● Limite de acordo com perfil do usuário
– Usuários não logados vs Usuários logados
– Apps pagos
– Perfis de acesso
● Gerenciar carga do servidor
52. Pasqua Tecnologia - http://douglaspasqua.com 52
Tratamento de Erros
● Regra -> responda sempre no formato que o
cliente esteja esperando. (Retornar HTML enquanto
estiver esperando JSON ???)
● Mensagens de erro significativas
– Permissão negada ?
– Dados de entrada faltantes/inválidos
– Função inexistente
– Enviar sugestões para o usuário em caso de erro
53. Pasqua Tecnologia - http://douglaspasqua.com 53
Documentação
● Boa API => Boa Documentação
● Use Ferramentas para automatizar o processo
– swagger (https://swagger.io)
54. Pasqua Tecnologia - http://douglaspasqua.com 54
Ferramentas de Apoio / Frameworks
● Apigility (https://apigility,org) - PHP
● swagger (https://swagger.io)
● Jersey (https://jersey,github.io) – Java
● Amazon API Gateway
● sensedia API Platform (https://sensedia.com)