Aboutme
• Web Developer na Concrete Solutions
• Blogueiro no udgwebdev.com
• Autor dos livros de Node.js/Meteor na Casa do Código
• Projetos
• DevFreeCasts (devfreecasts.org)
• DevFreeBooks (devfreebooks.org)
Tópicosadiscutir…
• Versionamento de APIs
• Definição de endpoints
• Métodos do HTTP
• Status do HTTP
• JSON de resposta
• Tratamento de erros
• Dicas de segurança
• Ferramenta para documentação de APIs
• Considerações finais
Definiçãodeendpoints
• Criando endpoints:
• Listando clientes
/clientes
• Visualizando um cliente
/clientes/{cliente_id}
• Executando uma ação de recurso
/clientes/{cliente_id}/login
• Visualizando uma determinada compra de um cliente
/clientes/{cliente_id}/compras/{compra_id}
Definiçãodeendpoints
• Organizando endpoints:
• Evite muitos “encadeamento" de endpoints:
• /clientes/1/compras/2/items/3
• Mantenha no máximo um duplo encadeamento de endpoints:
• /clientes/1/compras/2
• /compras/2/items/3
• Utilize nomes em plural para recursos e verbos para ações:
• /clientes/1/login
Definiçãodeendpoints
• Use querystrings para seleção de campos, ordenações e paginações:
• Paginando
/clientes?offset=10&limit=2
/clientes?page=10&limit=2
/clientes?page=10&per_page=2
• Ordenando
/clientes?sort=nome
• Selecionando campos
/clientes?fields=nome,idade
• Tudo junto!
/clientes?offset=10&limit=2&sort=nome&fields=nome
MétodosdoHTTP
• GET/clientes - Lista todos os clientes
• GET/clientes/1 - Visualiza um cliente
• POST/clientes - Cadastra um novo cliente
• PUT/clientes/1 - Atualiza todos os dados do cliente
• PATCH/clientes/1- Atualiza alguns dados do cliente
• DELETE/clientes/1- Exclui um cliente
JSONderesposta
Retornandoumobjeto
{
“code”:“12312cA",
“nome”:“João",
“idade”:18
}
Use UUID como id de objetos (campo code), evite id de banco de dados.
Evite retornar objetos que não estejam em relacionamento, neste caso crie
endpoints específicos para retornar cada um desses objetos.
Retornandoobjetosrelacionados
{
“code”:“12312cA”,
“nome”:“João”,
“compra”:{
“code”:“13333A”,
“valor”:10.00
}
}
Tratamentodeerros
• Retorne JSON de erros
Erros genéricos
{
“code”:“0001",
“message”:“Acessonegado!”
}
Erros de campos específicos
{
“code”:“0002”,
“errors”:[
{“nome”:[“Nomeembranco”]},
{“idade”:[“Idadeembranco”,“Vocêémenordeidade”]}
]
}
• Utilize corretamente os códigos 4xx ou 5xx do HTTP para definir seu respectivo status do erro.
• Não é obrigatório! Mas trabalhar com códigos de erros internos é uma boa prática também
Dicasdesegurança
• Implemente OAuth para clientes consumirem sua api
• Habilite o CORS (Cross-Origin Resource Sharing) para controlar acesso aos
recursos
• Evite o uso de Tokens estáticos para acesso a api
Consideraçõesfinais
• Crie versões client (consumers) que abstraia complexidade do consumo da
api para algumas ou as principais linguagens programação.
Exemplos: api-client-node, api-client-java, api-client-ruby…
• APIs de referência para estudos…
• Heroku: https://devcenter.heroku.com/categories/platform-api
Github: https://developer.github.com/v3
Twitter: https://dev.twitter.com/rest/public
Facebook: https://developers.facebook.com
• MarketPlace com várias APIs públicas: http://www.publicapis.com