SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
Web Services RESTful
Introdução e Conceitos
Por Douglas V. Pasqua
http://douglaspasqua.com
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
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
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)
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.
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
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
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
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
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
● ...
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
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.
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.
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
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
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
Pasqua Tecnologia - http://douglaspasqua.com 17
Usando Métodos HTTP para Serviços
RESTFul
Pasqua Tecnologia - http://douglaspasqua.com 18
Verbos HTTP Operação CRUD
GET Ler
POST Criar
PUT Substituir
PATCH Modificar
DELETE Excluir
Operações CRUD com HTTP
Pasqua Tecnologia - http://douglaspasqua.com 19
GET
● Deve ser usado somente para leitura (read).
● Idempotente
● Operação considerada “segura"
Pasqua Tecnologia - http://douglaspasqua.com 20
GET
➔ Itens Específicos
➔ GET http://api.example.net/singer/{id}
➔ GET http://api.example.net/singer/michaeljackson
➔ Coleções
➔ GET http://api.exampl.net/singers
Pasqua Tecnologia - http://douglaspasqua.com 21
GET - Representações
{
"name":"Michael Jackson",
"birthday":"1958-08-29",
"site":"michaeljackson.com",
"genres":[
"pop",
"rock",
"dance-pop"
]
}
<?xml version="1.0" encoding="UTF-8"?>
<singer>
<birthday>1958-08-29</birthday>
<genres>
<element>pop</element>
<element>rock</element>
<element>dance-pop</element>
</genres>
<name>Michael Jackson</name>
<site>michaeljackson.com</site>
</singer>
Pasqua Tecnologia - http://douglaspasqua.com 22
GET - Status Code
• 200 (OK)
• 404 (Not Found)
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
Pasqua Tecnologia - http://douglaspasqua.com 24
POST - Exemplo
● POST http://api.example.net/singer
{
"name":"Michael Jackson",
"birthday":"1958-08-29",
"site":"michaeljackson.com",
"genres":[
"pop",
"rock",
"dance-pop"
]
}
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."
}
Pasqua Tecnologia - http://douglaspasqua.com 26
POST - Status Code
● 201 Created (retornar Location)
● 400 Bad Request / 406 Not Acceptable
● 409 Conflict (registro duplicado)
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
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
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
Pasqua Tecnologia - http://douglaspasqua.com 30
PUT – Status Code
● 200 OK / 204 No Content
● 404 Not Found
● 400 Bad Request / 406 Not Acceptable
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
Pasqua Tecnologia - http://douglaspasqua.com 32
PATCH – Exemplo 1
● PATCH http://api.example.net/singer/michaeljackson
{
"birthday":"1958-08-29"
}
idempotente
Pasqua Tecnologia - http://douglaspasqua.com 33
PATCH – Exemplo 2
● PATCH http://api.example.net/singer/michaeljackson
{
"change":"birthday",
"from":"1958-08-28",
"from":"1958-08-29"
}
idempotente
Pasqua Tecnologia - http://douglaspasqua.com 34
PATCH – Exemplo 3
● PATCH http://api.example.net/singer/michaeljackson
{
"add":"genres",
"value":"blues"
}
idempotente
Pasqua Tecnologia - http://douglaspasqua.com 35
PATCH – Status Code
● 200 OK / 204 No Content
● 404 Not Found
● 400 Bad Request / 406 Not Acceptable
Pasqua Tecnologia - http://douglaspasqua.com 36
DELETE
● Usado para deletar um recurso
● Não é uma operação “segura”
● É idempotente
Pasqua Tecnologia - http://douglaspasqua.com 37
DELETE - Exemplos
● DELETE http://api.example.net/singer/michaeljackson
● DELETE http://api.example.net/singer/elvispresley
Pasqua Tecnologia - http://douglaspasqua.com 38
DELETE – Status Code
● 204 No Content
● 404 Not Found
Pasqua Tecnologia - http://douglaspasqua.com 39
Richardson Maturity Model
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
Pasqua Tecnologia - http://douglaspasqua.com 41
Pasqua Tecnologia - http://douglaspasqua.com 42
Protegendo APIs REST
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
Pasqua Tecnologia - http://douglaspasqua.com 44
Segurança em APIs REST
● Abordagens mais usadas
– Basic
– Digest
– OAuth
– JWT (Json Web Token)
Pasqua Tecnologia - http://douglaspasqua.com 45
Pontos a Considerar
● Cache
● Versionamento
● Limitar taxa de acesso
● Tratamento de erros
● Documentação
● Ferramentas de Apoio / Frameworks
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
Pasqua Tecnologia - http://douglaspasqua.com 47
Pasqua Tecnologia - http://douglaspasqua.com 48
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
Pasqua Tecnologia - http://douglaspasqua.com 50
Versionamento
● Content type
GET http://api.example.net/singer/michaeljackson
Accept: application/vnd.api.example+json;version=2
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
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
Pasqua Tecnologia - http://douglaspasqua.com 53
Documentação
● Boa API => Boa Documentação
● Use Ferramentas para automatizar o processo
– swagger (https://swagger.io)
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)
Pasqua Tecnologia - http://douglaspasqua.com 55
Referências
● http://restcookbook.com/
● http://martinfowler.com/articles/richardsonMatur
ityModel.html
● http://www.douglaspasqua.com/category/rest/
https://www.ics.uci.edu/~fielding/pubs/dissertat
ion/rest_arch_style.htm
● http://www.restapitutorial.com/httpstatuscodes.h
tml

Mais conteúdo relacionado

Semelhante a Web Services RESTful

Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
VoltDB: as vantagens e os desafios dos banco de dados NewSQL
VoltDB: as vantagens e os desafios dos banco de dados NewSQLVoltDB: as vantagens e os desafios dos banco de dados NewSQL
VoltDB: as vantagens e os desafios dos banco de dados NewSQLLuiz Henrique Zambom Santana
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaCleber Dantas
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
PHP RESTful Web Services
PHP RESTful Web ServicesPHP RESTful Web Services
PHP RESTful Web ServicesFelipe Ribeiro
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09Felipe Ribeiro
 
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018Renato Groff
 
Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)elliando dias
 
Tunning jvm em java 8
Tunning jvm em java 8Tunning jvm em java 8
Tunning jvm em java 8Luan Cestari
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneosFernando Ike
 
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018Tchelinux
 
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack Proxy
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack ProxyDetectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack Proxy
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack ProxyJeronimo Zucco
 
Desenvolvimento de uma plataforma de bookmarking social com Django e TDD
Desenvolvimento de uma plataforma de bookmarking social com Django e TDDDesenvolvimento de uma plataforma de bookmarking social com Django e TDD
Desenvolvimento de uma plataforma de bookmarking social com Django e TDDRodrigo Fernandes
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosBruno Ghisi
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código abertoSuissa
 

Semelhante a Web Services RESTful (20)

Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
VoltDB: as vantagens e os desafios dos banco de dados NewSQL
VoltDB: as vantagens e os desafios dos banco de dados NewSQLVoltDB: as vantagens e os desafios dos banco de dados NewSQL
VoltDB: as vantagens e os desafios dos banco de dados NewSQL
 
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escalaTDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
TDC - Técnicas e recursos para desenvolvimento web em cenários de grande escala
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
PHP RESTful Web Services
PHP RESTful Web ServicesPHP RESTful Web Services
PHP RESTful Web Services
 
Segurança Web com PHP5
Segurança Web com PHP5Segurança Web com PHP5
Segurança Web com PHP5
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09
 
Servidor Proxy Squid
Servidor Proxy SquidServidor Proxy Squid
Servidor Proxy Squid
 
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018
Docker: Introdução e Primeiros Passos - CEUNSP - Outubro-2018
 
Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)Linux Servidor Proxy(squid)
Linux Servidor Proxy(squid)
 
Tunning jvm em java 8
Tunning jvm em java 8Tunning jvm em java 8
Tunning jvm em java 8
 
Um milhao de usuários simultâneos
Um milhao de usuários simultâneosUm milhao de usuários simultâneos
Um milhao de usuários simultâneos
 
Vraptor 3
Vraptor 3Vraptor 3
Vraptor 3
 
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018
Owasp ZAP - Jeronimo Zucco - Tchelinux Caxias 2018
 
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack Proxy
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack ProxyDetectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack Proxy
Detectando Vulnerabilidades em seu Site utilizando OWASP ZAP - Zed Attack Proxy
 
Desenvolvimento de uma plataforma de bookmarking social com Django e TDD
Desenvolvimento de uma plataforma de bookmarking social com Django e TDDDesenvolvimento de uma plataforma de bookmarking social com Django e TDD
Desenvolvimento de uma plataforma de bookmarking social com Django e TDD
 
Ruby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviçosRuby on Rails 100% na cloud com heroku e outros serviços
Ruby on Rails 100% na cloud com heroku e outros serviços
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código aberto
 

Mais de Douglas V. Pasqua

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookDouglas V. Pasqua
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDouglas V. Pasqua
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php segurosDouglas V. Pasqua
 
Unicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresUnicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresDouglas V. Pasqua
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresDouglas V. Pasqua
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Douglas V. Pasqua
 

Mais de Douglas V. Pasqua (8)

Graph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para FacebookGraph API - Desenvolvimento para Facebook
Graph API - Desenvolvimento para Facebook
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Dicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHPDicas para sua carreira de Desenvolvedor PHP
Dicas para sua carreira de Desenvolvedor PHP
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
Unicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de CaracteresUnicode: Os segredos da Codificação de Caracteres
Unicode: Os segredos da Codificação de Caracteres
 
The Facebook Plataform
The Facebook PlataformThe Facebook Plataform
The Facebook Plataform
 
Tuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedoresTuning Apache/MySQL/PHP para desenvolvedores
Tuning Apache/MySQL/PHP para desenvolvedores
 
Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3Novas Funcionalidade no PHP 5.3
Novas Funcionalidade no PHP 5.3
 

Web Services RESTful

  • 1. Web Services RESTful Introdução e Conceitos Por Douglas V. Pasqua http://douglaspasqua.com
  • 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
  • 17. Pasqua Tecnologia - http://douglaspasqua.com 17 Usando Métodos HTTP para Serviços RESTFul
  • 18. Pasqua Tecnologia - http://douglaspasqua.com 18 Verbos HTTP Operação CRUD GET Ler POST Criar PUT Substituir PATCH Modificar DELETE Excluir Operações CRUD com HTTP
  • 19. Pasqua Tecnologia - http://douglaspasqua.com 19 GET ● Deve ser usado somente para leitura (read). ● Idempotente ● Operação considerada “segura"
  • 20. Pasqua Tecnologia - http://douglaspasqua.com 20 GET ➔ Itens Específicos ➔ GET http://api.example.net/singer/{id} ➔ GET http://api.example.net/singer/michaeljackson ➔ Coleções ➔ GET http://api.exampl.net/singers
  • 21. Pasqua Tecnologia - http://douglaspasqua.com 21 GET - Representações { "name":"Michael Jackson", "birthday":"1958-08-29", "site":"michaeljackson.com", "genres":[ "pop", "rock", "dance-pop" ] } <?xml version="1.0" encoding="UTF-8"?> <singer> <birthday>1958-08-29</birthday> <genres> <element>pop</element> <element>rock</element> <element>dance-pop</element> </genres> <name>Michael Jackson</name> <site>michaeljackson.com</site> </singer>
  • 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
  • 24. Pasqua Tecnologia - http://douglaspasqua.com 24 POST - Exemplo ● POST http://api.example.net/singer { "name":"Michael Jackson", "birthday":"1958-08-29", "site":"michaeljackson.com", "genres":[ "pop", "rock", "dance-pop" ] }
  • 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
  • 32. Pasqua Tecnologia - http://douglaspasqua.com 32 PATCH – Exemplo 1 ● PATCH http://api.example.net/singer/michaeljackson { "birthday":"1958-08-29" } idempotente
  • 33. Pasqua Tecnologia - http://douglaspasqua.com 33 PATCH – Exemplo 2 ● PATCH http://api.example.net/singer/michaeljackson { "change":"birthday", "from":"1958-08-28", "from":"1958-08-29" } idempotente
  • 34. Pasqua Tecnologia - http://douglaspasqua.com 34 PATCH – Exemplo 3 ● PATCH http://api.example.net/singer/michaeljackson { "add":"genres", "value":"blues" } 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
  • 37. Pasqua Tecnologia - http://douglaspasqua.com 37 DELETE - Exemplos ● DELETE http://api.example.net/singer/michaeljackson ● DELETE http://api.example.net/singer/elvispresley
  • 38. Pasqua Tecnologia - http://douglaspasqua.com 38 DELETE – Status Code ● 204 No Content ● 404 Not Found
  • 39. Pasqua Tecnologia - http://douglaspasqua.com 39 Richardson Maturity Model
  • 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
  • 41. Pasqua Tecnologia - http://douglaspasqua.com 41
  • 42. Pasqua Tecnologia - http://douglaspasqua.com 42 Protegendo APIs REST
  • 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
  • 47. Pasqua Tecnologia - http://douglaspasqua.com 47
  • 48. Pasqua Tecnologia - http://douglaspasqua.com 48
  • 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)
  • 55. Pasqua Tecnologia - http://douglaspasqua.com 55 Referências ● http://restcookbook.com/ ● http://martinfowler.com/articles/richardsonMatur ityModel.html ● http://www.douglaspasqua.com/category/rest/ https://www.ics.uci.edu/~fielding/pubs/dissertat ion/rest_arch_style.htm ● http://www.restapitutorial.com/httpstatuscodes.h tml