Fernando Camargo
Apresentado por
Mestrando em Engenharia de Computação, UFG
Design de RESTful APIs
Tópicos
1. Introdução ao REST
a. Por quê?
b. Seis Regras
c. Métodos e Status HTTP
2. Boas Práticas
a. Versionamento
b. Formato de Representação
c. HATEOAS
d. Representação Parcial e Paginação
e. Respostas de Erro
f. Segurança
g. Cache
Introdução ao REST
Web Sites
Web Services (SOAP)
Web Services (REST)
Por que REST?
•Menor gasto de rede
•Menor complexidade
•SOAP pensado para servidores
•REST pensado para dispositivos leves
•Possibilita cache
Seis Regras
REST é um Padrão Arquitetural sobre o HTTP com
as regras:
•Interface Uniforme
•Stateless
•Cacheável
•Cliente-Servidor
•Sistema em Camadas (Possibilidade)
•Código sob Demanda (Possibilidade)
Interface Uniforme
•Baseado em Recursos, não Ações
•Recursos identificados por URL
•Ações vinculados aos Métodos HTTP
Interface Uniforme
•Baseado em Recursos, não Ações
•Recursos identificados por URL
•Ações vinculados aos Métodos HTTP
•URLs com substantivos no Plural
URLs Erradas
•/listarProdutos
•/obterProdutos/1
•/criarProdutos
•/deletarProduto/1
URLs Corretas
•/produtos
•/produtos/1
Interface Uniforme
•Representational State Transfer
•HATEOAS: Hypermedia as the Engine of
Application State
•Mensagens autodescritivas
Métodos HTTP
✔Idempotência: múltiplas requisições não
alteram o resultado
•GET: obtenção
•HEAD: obtenção de metadados
•DELETE: remoção
•POST (não idempotente): criação sem
ID/atualização parcial
•PUT: atualização completa/criação com ID
Status HTTP
• 200 OK
• 201 Created
• 304 Not Modified
• 400 Bad Request
• 401 Unauthorized
• 403 Forbidden
• 404 Not Found
Boas Práticas
Versionamento
✔Evitar quebra de contrato com clientes
Tipos de versionamento:
•Através de URL
•Através de Tipo de Media
Formato de Representação
✔Suportar mais de um formato (XML e JSON)
Especificação do formato desejado:
•Através de URL (pouco usado)
•Através de Tipo de Media (Accept/Content-
Type)
Exemplos de requisições
• GET api.devfest.com.br/v1/palestrantes
Accept: application/json
• GET api.devfest.com.br/v1/palestrantes/23
Accept: application/json
• POST api.devfest.com.br/v1/palestrantes
Content-Type: application/json
Exemplos de requisições
• GET api.devfest.com.br/palestrantes
Accept: application/vnd.palestrantes-v1+json
• GET api.devfest.com.br/palestrantes/23
Accept: application/vnd.palestrantes-v1+json
• POST api.devfest.com.br/palestrantes
Content-Type: application/vnd.palestrantes-
v1+json
Representação parcial
• Parâmetro “fields”
• GET api.devfest.com.br/palestrantes?
fields=nome,endereco
{
“href”: “https://api.devfest.com.br/palestrantes/23”,
“nome”: “Fernando Camargo”,
“endereco”: {
“href”: “https://api.devfest.com.br/enderecos/23”
}
}
Representação parcial
• Parâmetro “expand”
• GET api.devfest.com.br/palestrantes?
fields=nome,endereco&expand=endereco
{
“href”: “https://api.devfest.com.br/palestrantes/23”,
“nome”: “Fernando Camargo”,
“endereco”: {
“href”: “https://api.devfest.com.br/enderecos/23”,
“logradouro” : “Rua 31-A”, ...
}
}
HATEOAS
• Atributo “href”
{
“href”: “https://api.devfest.com.br/palestrantes/23”,
“nome”: “Fernando Camargo”, …,
“endereco”: {
“href”: “https://api.devfest.com.br/enderecos/23”,
“logradouro” : “Rua 31-A”, ...
}
}
HATEOAS
• Paginação
{
“href”: “https://api.devfest.com.br/palestrantes”, …
“next”: {“href”: “...”},
“previous”: {“href”: “...”},
“last”: {“href”: “...”},
“items”: [
{“href”: “...”, …},
{“href”: “...”, …}, ...
]
}
Respostas de Erro
•Utilizar Status HTTP
•Documentar e identificar erros
•Prover URL para documentação do erro
•Prover mensagem para usuário e
desenvolvedor
Respostas de Erro
409 Conflict
{
“code”: 145,
“message”: “Já existe um palestrante com esse CPF.”,
“devMessage”: “Já existe um palestrante com esse CPF.
Pode ser causado por repetição de requisições.”,
“moreInfo”:
“https://dev.devfest.com.br/docs/api/errors/145”
}
Segurança
• Oauth 1.0a ou 2.0
• Autenticação acontece em toda requisição
Cache
• Header “Etag” com hash do Recurso na
resposta
• Header “If-None-Match” com o hash anterior
do Recurso em nova requisição
• 304 Not Modified
Dúvidas?
fernando.camargo.ti@gmail.com
Contato:

Design de RESTful APIs