SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler offline
BoaspráticasdeAPIDesign
Caio Ribeiro Pereira
@crp_underground

http://crpwebdev.com

http://udgwebdev.com
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
VersionamentodeAPIs
• Exemplos de versionamento:
• url: api.com/v1/endpoint (via código da API)
• subdomain: v1.api.com/endpoint (via DNS)
• header: “Accept”=“application/vnd.api.v1.json” (via Middleware)
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
StatusdoHTTP
• 2xx-Statusdesucesso

3xx-Statusderedirecionamento

4xx-Statusdeerronocliente

5xx-Statusdeerronoservidor
• Exemplos de status mais utilizados:
• 200-OK,201-Created,204-NoContent
• 404-NotFound,401-Unauthorized,405-MethodNotAllowed
• 412-PreconditionFailed,411-LengthRequired,408-RequestTimeout
• 500-InternalServerError,501-NotImplemented
• Veja mais status em: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
• Dica: Padronize sua API para usar entre 7-12 status codes.
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
FerramentaparadocumentaçãodeAPIs
Swagger

http://swagger.io

Permitetrabalharcommockseéserverself-hosted
FerramentaparadocumentaçãodeAPIs
ApiDoc.js

http://apidocjs.com

Geradocumentaçãoemcimadecomentáriosnocódigo
/**
* @api {get} /signin Singin
* @apiGroup Sistema
*
* @apiSuccess {String} status Mensagem de acesso autorizado
*
* @apiSuccessExample {json} Sucesso
* HTTP/1.1 200 OK
* {
* "status": "Logado!"
* }
*
*/
app.get("/signin", function(req, res) {
res.json({status: "Logado!"});
});
FerramentaparadocumentaçãodeAPIs
Apiary

http://apiary.io

SaaS,documentaçãoemmarkdownetrabalhacommocks
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

Obrigado!
THEEND

Mais conteúdo relacionado

Mais procurados

Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Bruno Grange
 
Node.js - Devo adotar na minha empresa?
Node.js - Devo adotar na minha empresa?Node.js - Devo adotar na minha empresa?
Node.js - Devo adotar na minha empresa?Pablo Souza
 
PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaHenrique Gogó
 
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSDesenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSRomulo Fagundes
 
Introdução à Node.js + MongoDB
Introdução à Node.js + MongoDBIntrodução à Node.js + MongoDB
Introdução à Node.js + MongoDBLuiz Duarte
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScriptCarlos Eduardo Kadu
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stackSidney Roberto
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseLuiz Duarte
 
Aula 5 java script
Aula 5   java scriptAula 5   java script
Aula 5 java scriptandreluizlc
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Aula 8 php (intro, get e post)
Aula 8   php (intro, get e post)Aula 8   php (intro, get e post)
Aula 8 php (intro, get e post)andreluizlc
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terEmerson Macedo
 
O que é nodejs, cases e vantagens
O que é nodejs, cases e vantagensO que é nodejs, cases e vantagens
O que é nodejs, cases e vantagensRodrigo Matheus
 
AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!Lucas Brasilino
 
Mecanismo de busca .NET Core + MongoDB
Mecanismo de busca .NET Core + MongoDBMecanismo de busca .NET Core + MongoDB
Mecanismo de busca .NET Core + MongoDBLuiz Duarte
 
Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Henrique Gogó
 

Mais procurados (20)

Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)Minicurso de JavaScript (Portuguese)
Minicurso de JavaScript (Portuguese)
 
Node.js - Devo adotar na minha empresa?
Node.js - Devo adotar na minha empresa?Node.js - Devo adotar na minha empresa?
Node.js - Devo adotar na minha empresa?
 
PhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha CamaradaPhantomJS - O Fantasminha Camarada
PhantomJS - O Fantasminha Camarada
 
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSDesenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
 
Introdução à Node.js + MongoDB
Introdução à Node.js + MongoDBIntrodução à Node.js + MongoDB
Introdução à Node.js + MongoDB
 
Introdução básica ao JavaScript
Introdução básica ao JavaScriptIntrodução básica ao JavaScript
Introdução básica ao JavaScript
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stack
 
Workshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + MongooseWorkshop Node.js + MongoDB + Mongoose
Workshop Node.js + MongoDB + Mongoose
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Aula 5 java script
Aula 5   java scriptAula 5   java script
Aula 5 java script
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Aula 8 php (intro, get e post)
Aula 8   php (intro, get e post)Aula 8   php (intro, get e post)
Aula 8 php (intro, get e post)
 
Nodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis terNodejs - A performance que eu sempre quis ter
Nodejs - A performance que eu sempre quis ter
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
O que é nodejs, cases e vantagens
O que é nodejs, cases e vantagensO que é nodejs, cases e vantagens
O que é nodejs, cases e vantagens
 
Javascript para adultos
Javascript para adultosJavascript para adultos
Javascript para adultos
 
AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!
 
Mecanismo de busca .NET Core + MongoDB
Mecanismo de busca .NET Core + MongoDBMecanismo de busca .NET Core + MongoDB
Mecanismo de busca .NET Core + MongoDB
 
Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011Conhecendo o CouchDB - TDC2011
Conhecendo o CouchDB - TDC2011
 
MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 

Destaque

Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesCaelum
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaCaelum
 
Service worker - Offline Web
Service worker - Offline WebService worker - Offline Web
Service worker - Offline WebBruno Oliveira
 
Web 2.0 - From a Social to a Service Web
Web 2.0 - From a Social to a Service WebWeb 2.0 - From a Social to a Service Web
Web 2.0 - From a Social to a Service WebJury Konga
 
A Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesA Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesRafael Brinhosa
 
Monografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsMonografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsLuiz Oliveira
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web AppsToninho Sousa
 
Micro Web Service - Slim and JWT
Micro Web Service - Slim and JWTMicro Web Service - Slim and JWT
Micro Web Service - Slim and JWTTuyen Vuong
 
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)iMasters
 
Material design para web
Material design para webMaterial design para web
Material design para webAugusto Sandim
 
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETProgressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETAndre Baltieri
 
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário Osmar Petry
 

Destaque (14)

Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio Lopes
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
 
JavaScript Hacks
JavaScript HacksJavaScript Hacks
JavaScript Hacks
 
Service worker - Offline Web
Service worker - Offline WebService worker - Offline Web
Service worker - Offline Web
 
Web 2.0 - From a Social to a Service Web
Web 2.0 - From a Social to a Service WebWeb 2.0 - From a Social to a Service Web
Web 2.0 - From a Social to a Service Web
 
A Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesA Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web Services
 
Monografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsMonografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native Apps
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Micro Web Service - Slim and JWT
Micro Web Service - Slim and JWTMicro Web Service - Slim and JWT
Micro Web Service - Slim and JWT
 
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
 
Redes linux excerto
Redes linux excertoRedes linux excerto
Redes linux excerto
 
Material design para web
Material design para webMaterial design para web
Material design para web
 
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETProgressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
 
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
 

Semelhante a Boas práticas de API Design

Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSMatheus Donizete
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled gardenGuilherme
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - ApresentaçãoTerra / Neo
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilLuis Cipriani
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaSensedia
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Luis Cipriani
 
Fisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFabio Akita
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - ModelosTiago Lima
 
JSF com Primefaces
JSF com PrimefacesJSF com Primefaces
JSF com PrimefacesFabio Noth
 

Semelhante a Boas práticas de API Design (20)

Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled garden
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EE
 
GUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EEGUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EE
 
Nosql4java
Nosql4javaNosql4java
Nosql4java
 
Mongo db slides
Mongo db slidesMongo db slides
Mongo db slides
 
MongoDB - Apresentação
MongoDB - ApresentaçãoMongoDB - Apresentação
MongoDB - Apresentação
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
Workshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha BásicaWorkshop Hands-On APIX 2018 - Trilha Básica
Workshop Hands-On APIX 2018 - Trilha Básica
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
 
Design de APIs REST
Design de APIs RESTDesign de APIs REST
Design de APIs REST
 
Como um grande sistema REST funciona
Como um grande sistema REST funcionaComo um grande sistema REST funciona
Como um grande sistema REST funciona
 
Fisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on RailsFisl 11 - Ecossistema Ruby on Rails
Fisl 11 - Ecossistema Ruby on Rails
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1Treinamento Elasticsearch - Parte 1
Treinamento Elasticsearch - Parte 1
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - Modelos
 
JSF com Primefaces
JSF com PrimefacesJSF com Primefaces
JSF com Primefaces
 

Boas práticas de API Design