SlideShare uma empresa Scribd logo
1 de 36
APIS DO JEITO CERTO
RAVAN SCAFI
• Ravan Scafi
• Web Developer @ Leroy
Merlin
• Co-organizador do Meetup
do Laravel-SP
• twitter.com/ravanscafi
SOBRE MIM
SOBRE A APRESENTAÇÃO
• Motivação
• Boas práticas na construção de APIs
• Lições Aprendidas
• Laravel / Lumen ao resgate!
APIS REST EM 1 MINUTO
• Recursos como substantivos
• Verbos HTTP especificam a ação
$ curl -XGET localhost/api/users/123
MOTIVAÇÃO
• Por que escrever uma API?
• O que implica ter uma API?
# DOCUMENTAÇÃO
“Uma API é apenas tão boa quanto
sua documentação”
apiary.io
SWAGGER / OPEN API
• Uma forma de documentar sua API
• Único arquivo swagger.json
• Consumível por Humanos e por Máquinas
• Swagger-UI: ❤️ ❤️ ❤️ ❤️
DOCUMENTAÇÃO: DICAS
• Mantenha a documentação próxima ao código
• Regras de bom código também valem para
documentação
• https://github.com/zircote/swagger-php
<?php
class UserController
{
/**
* @SWGPost(path="/user",
* tags={"user"},
* summary="Create user",
* description="This can only be done by the logged in user.",
* operationId="createUser",
* produces={"application/xml", "application/json"},
* @SWGParameter(
* in="body",
* name="body",
* description="Created user object",
* required=false,
* @SWGSchema(ref="#/definitions/User")
* ),
* @SWGResponse(response="default", description="successful operation")
* )
*/
public function createUser()
{
}
}
Swagger-PHP: Exemplo
<?php
$basePath = __DIR__ . '/..';
require_once $basePath . '/vendor/autoload.php';
// grabbing info from .env file
$beforeEnv = $_ENV;
(new DotenvDotenv($basePath))->load();
$envVars = array_diff($_ENV, $beforeEnv);
// grabbing info from composer.json file
$composerFile = json_decode(file_get_contents($basePath . '/composer.json'));
$composerInfo = [
'COMPOSER_NAME' => $composerFile->name ?? null,
'COMPOSER_DESCRIPTION' => $composerFile->description ?? null,
'COMPOSER_VERSION' => $composerFile->version ?? '0.0.0',
'COMPOSER_LICENSE' => $composerFile->license ?? null,
];
// defining grabbed info as constants
$desiredConstants = array_filter(array_merge($envVars, $composerInfo));
array_map('define', array_keys($desiredConstants), $desiredConstants);
bootstrap/swagger.php
{
...
"autoload": {
"psr-4": {
"App": "app/"
}
},
"scripts": {
"api-docs": "swagger app -o public/docs.json -b bootstrap/swagger.php",
}
}
composer.json
$ composer api-docs
# DESIGN
VERSIONAMENTO
• Internamente: Semantic Versioning
• Publicamente: só mude versões cheias (v1, v2)
• Evite Breaking Changes (BC) o máximo que
conseguir
O QUE CONFIGURA UMA BC?
• Remover campos: SIM
• Renomear campos: SIM
• Adicionar campos: NÃO
• Adicionar recursos / endpoints: NÃO
PROTEJA-SE COM MUTATORS
• Apresentação e transformação dos dados
• Uma “barreira” entre os recursos e a API
• Typecasting, relacionamentos
<?php
use AcmeModelBook;
use LeagueFractal;
$books = Book::all();
$resource = new FractalResourceCollection($books, function(Book $book) {
return [
'id' => (int) $book->id,
'title' => $book->title,
'year' => $book->yr,
'author' => [
'name' => $book->author_name,
'email' => $book->author_email,
],
'links' => [
[
'rel' => 'self',
'uri' => '/books/'.$book->id,
]
]
];
});
Transformer: Exemplo
NEGOCIAÇÃO DE CONTEÚDO
• JSON é JavaScript, portanto use camelCase
• /api/user/123.json, /api/user/123.csv
• Recursos embedados: trazer dinamicamente ou não
• Metadados: URI, página atual, count total
• Verbo HTTP: override com _method
RESPOSTAS
• Padronize campos como: datas, floats, moedas
• Padronize códigos HTTP de resposta
• Padronize paginação, metadados, etc.
RESPOSTAS
• Faça um “wrap” da resposta em uma chave “data”
• Mostre o erro, ao invés de um código de erro
• Nunca exponha exceptions para os usuários
• Não reinvente a roda, seja coerente com padrões
AUTENTICAÇÃO
• Baseados em Sessão: NÃO
• APIs devem ser sem estados (stateless)
• Implementação em mobile é custosa
• Baseados em Token: SIM
• OAuth? OAuth2? JWT? Http-Basic?
OAUTH VS JWT
• Não são “concorrentes” diretos
• É até mesmo possível utilizar os dois em conjunto
• OAuth: concebido para autorização (pseudo
autenticação)
• 3-legged vs 2-legged
• JWT: concebido para claims / autenticação
Como se parece um token JWT
SEGURANÇA
• Evite expor IDs sequenciais
• Limite as requisições (Throttling), porém configurável
por conta
• Não utilize sessões ou logins por senhas (exceto em
aplicativos próprios)
• API somente em HTTPS
• Verifique sempre vulnerabilidades com OAuth / JWT
# LARAVEL VS LUMEN
LARAVEL VS LUMEN
• Já tenho um app em Laravel: Laravel!
• Já tenho um app em Lumen: Lumen!
• Vou começar: Lumen!
• Use e abuse de Middlewares
• Agrupe rotas por versão
<?php
$app->group(['prefix' => 'api'], function () use ($app) {
$app->group(['prefix' => 'v1'], function () use ($app) {
$app->get('users', function () {});
$app->get('products', function () {});
});
$app->group(['prefix' => 'v2'], function () use ($app) {
$app->get('users', function () {});
$app->get('products', function () {});
});
});
Grupos de Rotas por Versão
PACOTES ÚTEIS
• Dingo/API
• Zircote/Swagger-PHP
• TymonDesigns/JWT-Auth
• League - OAuth2 Server
• League - Fractal
• Ramsey - UUID
DINGO/API
• Negociação de Conteúdo
• Múltiplos Adaptadores de Autenticação
• Versionamento da API
• Limitação de Requisições
DINGO/API
• Transformers and Formatters de Respostas
• Handling de Exceptions e Erros
• Requests Internos
• Documentação Blueprint
• Build APIs You Won't Hate
• Heroku's HTTP API
Design
• Open API Initiative
• Petstore (demo swagger)
• 2-legged OAuth
LIVROS E RECURSOS
LEMBREM-SE: EMPATIA É A CHAVE
OBRIGADO!
@ravanscafi
ESTAMOS CONTRATANDO :)
rscafi@leroymerlin.com.br

Mais conteúdo relacionado

Mais procurados

Laravel 5
Laravel 5Laravel 5
Laravel 5DevMT
 
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerConstruindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerDelermando Santos Miranda
 
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Tiago Hillebrandt
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panosLaís Lima
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015Renato Groff
 
Desenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyDesenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyRelsi Maron
 
Introducao ao Ruby On Rails
Introducao ao Ruby On RailsIntroducao ao Ruby On Rails
Introducao ao Ruby On RailsAndre Ferraro
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimentamichel adriano medeiros
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015Renato Groff
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.jsDenis Velrino
 
Criando uma aplicação simples com ruby on rails
Criando uma aplicação simples com ruby on railsCriando uma aplicação simples com ruby on rails
Criando uma aplicação simples com ruby on railsCOTIC-PROEG (UFPA)
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on RailsCJR, UnB
 
Desenvolvimento web com Ruby on Rails (parte 1)
Desenvolvimento web com Ruby on Rails (parte 1)Desenvolvimento web com Ruby on Rails (parte 1)
Desenvolvimento web com Ruby on Rails (parte 1)Joao Lucas Santana
 
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...Leo Baiano
 

Mais procurados (20)

Laravel 5
Laravel 5Laravel 5
Laravel 5
 
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e SwaggerConstruindo uma API, Client e Documentação usando Silex, Angular e Swagger
Construindo uma API, Client e Documentação usando Silex, Angular e Swagger
 
Como fazer boas libs
Como fazer boas libs Como fazer boas libs
Como fazer boas libs
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
Melhorando o desempenho do seu WordPress [WordCamp São Paulo 2015]
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
Javascript por debaixo dos panos
Javascript por debaixo dos panosJavascript por debaixo dos panos
Javascript por debaixo dos panos
 
C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015C# 6.0 - Interopmix 2015
C# 6.0 - Interopmix 2015
 
Desenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2pyDesenvolvimento web ágil com python e web2py
Desenvolvimento web ágil com python e web2py
 
Introducao ao Ruby On Rails
Introducao ao Ruby On RailsIntroducao ao Ruby On Rails
Introducao ao Ruby On Rails
 
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando PimentaIniciando com Ruby on Rails - Luiz Fernando Pimenta
Iniciando com Ruby on Rails - Luiz Fernando Pimenta
 
C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015C# 6.0 - DotNetBaixada - Novembro/2015
C# 6.0 - DotNetBaixada - Novembro/2015
 
Groovy stack
Groovy stackGroovy stack
Groovy stack
 
Rails na pratica
Rails na praticaRails na pratica
Rails na pratica
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.js
 
Criando uma aplicação simples com ruby on rails
Criando uma aplicação simples com ruby on railsCriando uma aplicação simples com ruby on rails
Criando uma aplicação simples com ruby on rails
 
Curso de Ruby on Rails
Curso de Ruby on RailsCurso de Ruby on Rails
Curso de Ruby on Rails
 
Desenvolvimento web com Ruby on Rails (parte 1)
Desenvolvimento web com Ruby on Rails (parte 1)Desenvolvimento web com Ruby on Rails (parte 1)
Desenvolvimento web com Ruby on Rails (parte 1)
 
Django - Muito além do básico
Django - Muito além do básicoDjango - Muito além do básico
Django - Muito além do básico
 
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...
Coisas que eu gostaria de saber antes de começar a desenvolver temas e plugin...
 

Destaque

Hackeando sua aplicaçao php na pratica
Hackeando sua aplicaçao php na pratica Hackeando sua aplicaçao php na pratica
Hackeando sua aplicaçao php na pratica Cyrille Grandval
 
Pensando fora da caixa
Pensando fora da caixaPensando fora da caixa
Pensando fora da caixaWilliam "Kina"
 
Comunicação em tempo real com WebRTC e PHP
Comunicação em tempo real com WebRTC e PHPComunicação em tempo real com WebRTC e PHP
Comunicação em tempo real com WebRTC e PHPMichael Douglas
 
Open API Strategy, by Sensedia
Open API Strategy, by SensediaOpen API Strategy, by Sensedia
Open API Strategy, by SensediaSensedia
 
Soa Em Tempos De Crise
Soa Em Tempos De CriseSoa Em Tempos De Crise
Soa Em Tempos De CriseSensedia
 
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...Sensedia
 
Soa Next Steps/Passos de Adoção SOA
Soa Next Steps/Passos de Adoção SOASoa Next Steps/Passos de Adoção SOA
Soa Next Steps/Passos de Adoção SOASensedia
 
SOA e APIs: O que muda e o que segue!
SOA e APIs: O que muda e o que segue!SOA e APIs: O que muda e o que segue!
SOA e APIs: O que muda e o que segue!Sensedia
 
Construindo APIs Mobile
Construindo APIs MobileConstruindo APIs Mobile
Construindo APIs MobileSensedia
 
Construção de APIs para apps móveis
Construção de APIs para apps móveisConstrução de APIs para apps móveis
Construção de APIs para apps móveisSensedia
 
Repositorio SOA
Repositorio SOARepositorio SOA
Repositorio SOASensedia
 
Governança de Serviços Automatizada na Prática
Governança de Serviços Automatizada na PráticaGovernança de Serviços Automatizada na Prática
Governança de Serviços Automatizada na PráticaSensedia
 
REST - padrões e melhores práticas
REST - padrões e melhores práticasREST - padrões e melhores práticas
REST - padrões e melhores práticasSensedia
 
A Practical Guide to WebRTC
A Practical Guide to WebRTCA Practical Guide to WebRTC
A Practical Guide to WebRTCvline
 
Qualidade - pensando fora da caixa
Qualidade - pensando fora da caixaQualidade - pensando fora da caixa
Qualidade - pensando fora da caixaJorge Diz
 
Hadoop - Primeiros passos
Hadoop - Primeiros passosHadoop - Primeiros passos
Hadoop - Primeiros passosSensedia
 
Indicadores para APIs
Indicadores para APIsIndicadores para APIs
Indicadores para APIsSensedia
 

Destaque (18)

Hackeando sua aplicaçao php na pratica
Hackeando sua aplicaçao php na pratica Hackeando sua aplicaçao php na pratica
Hackeando sua aplicaçao php na pratica
 
Aplicando SOLID com PHP7
Aplicando SOLID com PHP7Aplicando SOLID com PHP7
Aplicando SOLID com PHP7
 
Pensando fora da caixa
Pensando fora da caixaPensando fora da caixa
Pensando fora da caixa
 
Comunicação em tempo real com WebRTC e PHP
Comunicação em tempo real com WebRTC e PHPComunicação em tempo real com WebRTC e PHP
Comunicação em tempo real com WebRTC e PHP
 
Open API Strategy, by Sensedia
Open API Strategy, by SensediaOpen API Strategy, by Sensedia
Open API Strategy, by Sensedia
 
Soa Em Tempos De Crise
Soa Em Tempos De CriseSoa Em Tempos De Crise
Soa Em Tempos De Crise
 
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...
Hackathons & Innovation: como engajar desenvolvedores em torno da sua empresa...
 
Soa Next Steps/Passos de Adoção SOA
Soa Next Steps/Passos de Adoção SOASoa Next Steps/Passos de Adoção SOA
Soa Next Steps/Passos de Adoção SOA
 
SOA e APIs: O que muda e o que segue!
SOA e APIs: O que muda e o que segue!SOA e APIs: O que muda e o que segue!
SOA e APIs: O que muda e o que segue!
 
Construindo APIs Mobile
Construindo APIs MobileConstruindo APIs Mobile
Construindo APIs Mobile
 
Construção de APIs para apps móveis
Construção de APIs para apps móveisConstrução de APIs para apps móveis
Construção de APIs para apps móveis
 
Repositorio SOA
Repositorio SOARepositorio SOA
Repositorio SOA
 
Governança de Serviços Automatizada na Prática
Governança de Serviços Automatizada na PráticaGovernança de Serviços Automatizada na Prática
Governança de Serviços Automatizada na Prática
 
REST - padrões e melhores práticas
REST - padrões e melhores práticasREST - padrões e melhores práticas
REST - padrões e melhores práticas
 
A Practical Guide to WebRTC
A Practical Guide to WebRTCA Practical Guide to WebRTC
A Practical Guide to WebRTC
 
Qualidade - pensando fora da caixa
Qualidade - pensando fora da caixaQualidade - pensando fora da caixa
Qualidade - pensando fora da caixa
 
Hadoop - Primeiros passos
Hadoop - Primeiros passosHadoop - Primeiros passos
Hadoop - Primeiros passos
 
Indicadores para APIs
Indicadores para APIsIndicadores para APIs
Indicadores para APIs
 

Semelhante a APIs do Jeito Certo

Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web APIVinicius Mussak
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
Deck apix 2017 design &amp; security - case cielo lio
Deck apix 2017   design &amp; security - case cielo lioDeck apix 2017   design &amp; security - case cielo lio
Deck apix 2017 design &amp; security - case cielo lioLuis Moraes Junior
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLtarginosilveira
 
Atualizando rails do 2.x para 3.x
Atualizando rails do 2.x para 3.xAtualizando rails do 2.x para 3.x
Atualizando rails do 2.x para 3.xRodrigo Urubatan
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaAmazon Web Services LATAM
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceJosé Roberto Araújo
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIIvan Paulovich
 
TDC2016SP - Construindo Web APIs em Java na era do Big Data
TDC2016SP - Construindo Web APIs em Java na era do Big DataTDC2016SP - Construindo Web APIs em Java na era do Big Data
TDC2016SP - Construindo Web APIs em Java na era do Big Datatdc-globalcode
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]Igor Santos
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptIvan Paulovich
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Emerson Macedo
 
ASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsAndre Baltieri
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...BrunoSouza617
 
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...iMasters
 
Ruby on Rails: um estudo de viabilidade em ambientes empresariais
Ruby on Rails: um estudo de viabilidade em ambientes empresariaisRuby on Rails: um estudo de viabilidade em ambientes empresariais
Ruby on Rails: um estudo de viabilidade em ambientes empresariaisRodrigo Recio
 

Semelhante a APIs do Jeito Certo (20)

Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web API
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
De 0 a DevOps
De 0 a DevOpsDe 0 a DevOps
De 0 a DevOps
 
Deck apix 2017 design &amp; security - case cielo lio
Deck apix 2017   design &amp; security - case cielo lioDeck apix 2017   design &amp; security - case cielo lio
Deck apix 2017 design &amp; security - case cielo lio
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
Atualizando rails do 2.x para 3.x
Atualizando rails do 2.x para 3.xAtualizando rails do 2.x para 3.x
Atualizando rails do 2.x para 3.x
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 
Api platform
Api platformApi platform
Api platform
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performance
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web API
 
TDC2016SP - Construindo Web APIs em Java na era do Big Data
TDC2016SP - Construindo Web APIs em Java na era do Big DataTDC2016SP - Construindo Web APIs em Java na era do Big Data
TDC2016SP - Construindo Web APIs em Java na era do Big Data
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
 
Plack
PlackPlack
Plack
 
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010Beyond Ruby with NodeJS - RubyConf Brasil 2010
Beyond Ruby with NodeJS - RubyConf Brasil 2010
 
ASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance TipsASP.NET Core APIs: Performance Tips
ASP.NET Core APIs: Performance Tips
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
 
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...
DevCommerce Conference 2016 - Workshop: Velocidade e confiabilidade em e-comm...
 
Ruby on Rails: um estudo de viabilidade em ambientes empresariais
Ruby on Rails: um estudo de viabilidade em ambientes empresariaisRuby on Rails: um estudo de viabilidade em ambientes empresariais
Ruby on Rails: um estudo de viabilidade em ambientes empresariais
 

APIs do Jeito Certo

  • 1. APIS DO JEITO CERTO RAVAN SCAFI
  • 2. • Ravan Scafi • Web Developer @ Leroy Merlin • Co-organizador do Meetup do Laravel-SP • twitter.com/ravanscafi SOBRE MIM
  • 3. SOBRE A APRESENTAÇÃO • Motivação • Boas práticas na construção de APIs • Lições Aprendidas • Laravel / Lumen ao resgate!
  • 4. APIS REST EM 1 MINUTO • Recursos como substantivos • Verbos HTTP especificam a ação $ curl -XGET localhost/api/users/123
  • 5. MOTIVAÇÃO • Por que escrever uma API? • O que implica ter uma API?
  • 7. “Uma API é apenas tão boa quanto sua documentação” apiary.io
  • 8.
  • 9. SWAGGER / OPEN API • Uma forma de documentar sua API • Único arquivo swagger.json • Consumível por Humanos e por Máquinas • Swagger-UI: ❤️ ❤️ ❤️ ❤️
  • 10.
  • 11. DOCUMENTAÇÃO: DICAS • Mantenha a documentação próxima ao código • Regras de bom código também valem para documentação • https://github.com/zircote/swagger-php
  • 12. <?php class UserController { /** * @SWGPost(path="/user", * tags={"user"}, * summary="Create user", * description="This can only be done by the logged in user.", * operationId="createUser", * produces={"application/xml", "application/json"}, * @SWGParameter( * in="body", * name="body", * description="Created user object", * required=false, * @SWGSchema(ref="#/definitions/User") * ), * @SWGResponse(response="default", description="successful operation") * ) */ public function createUser() { } } Swagger-PHP: Exemplo
  • 13. <?php $basePath = __DIR__ . '/..'; require_once $basePath . '/vendor/autoload.php'; // grabbing info from .env file $beforeEnv = $_ENV; (new DotenvDotenv($basePath))->load(); $envVars = array_diff($_ENV, $beforeEnv); // grabbing info from composer.json file $composerFile = json_decode(file_get_contents($basePath . '/composer.json')); $composerInfo = [ 'COMPOSER_NAME' => $composerFile->name ?? null, 'COMPOSER_DESCRIPTION' => $composerFile->description ?? null, 'COMPOSER_VERSION' => $composerFile->version ?? '0.0.0', 'COMPOSER_LICENSE' => $composerFile->license ?? null, ]; // defining grabbed info as constants $desiredConstants = array_filter(array_merge($envVars, $composerInfo)); array_map('define', array_keys($desiredConstants), $desiredConstants); bootstrap/swagger.php
  • 14. { ... "autoload": { "psr-4": { "App": "app/" } }, "scripts": { "api-docs": "swagger app -o public/docs.json -b bootstrap/swagger.php", } } composer.json $ composer api-docs
  • 16. VERSIONAMENTO • Internamente: Semantic Versioning • Publicamente: só mude versões cheias (v1, v2) • Evite Breaking Changes (BC) o máximo que conseguir
  • 17. O QUE CONFIGURA UMA BC? • Remover campos: SIM • Renomear campos: SIM • Adicionar campos: NÃO • Adicionar recursos / endpoints: NÃO
  • 18. PROTEJA-SE COM MUTATORS • Apresentação e transformação dos dados • Uma “barreira” entre os recursos e a API • Typecasting, relacionamentos
  • 19. <?php use AcmeModelBook; use LeagueFractal; $books = Book::all(); $resource = new FractalResourceCollection($books, function(Book $book) { return [ 'id' => (int) $book->id, 'title' => $book->title, 'year' => $book->yr, 'author' => [ 'name' => $book->author_name, 'email' => $book->author_email, ], 'links' => [ [ 'rel' => 'self', 'uri' => '/books/'.$book->id, ] ] ]; }); Transformer: Exemplo
  • 20. NEGOCIAÇÃO DE CONTEÚDO • JSON é JavaScript, portanto use camelCase • /api/user/123.json, /api/user/123.csv • Recursos embedados: trazer dinamicamente ou não • Metadados: URI, página atual, count total • Verbo HTTP: override com _method
  • 21. RESPOSTAS • Padronize campos como: datas, floats, moedas • Padronize códigos HTTP de resposta • Padronize paginação, metadados, etc.
  • 22. RESPOSTAS • Faça um “wrap” da resposta em uma chave “data” • Mostre o erro, ao invés de um código de erro • Nunca exponha exceptions para os usuários • Não reinvente a roda, seja coerente com padrões
  • 23. AUTENTICAÇÃO • Baseados em Sessão: NÃO • APIs devem ser sem estados (stateless) • Implementação em mobile é custosa • Baseados em Token: SIM • OAuth? OAuth2? JWT? Http-Basic?
  • 24. OAUTH VS JWT • Não são “concorrentes” diretos • É até mesmo possível utilizar os dois em conjunto • OAuth: concebido para autorização (pseudo autenticação) • 3-legged vs 2-legged • JWT: concebido para claims / autenticação
  • 25. Como se parece um token JWT
  • 26. SEGURANÇA • Evite expor IDs sequenciais • Limite as requisições (Throttling), porém configurável por conta • Não utilize sessões ou logins por senhas (exceto em aplicativos próprios) • API somente em HTTPS • Verifique sempre vulnerabilidades com OAuth / JWT
  • 27. # LARAVEL VS LUMEN
  • 28. LARAVEL VS LUMEN • Já tenho um app em Laravel: Laravel! • Já tenho um app em Lumen: Lumen! • Vou começar: Lumen! • Use e abuse de Middlewares • Agrupe rotas por versão
  • 29. <?php $app->group(['prefix' => 'api'], function () use ($app) { $app->group(['prefix' => 'v1'], function () use ($app) { $app->get('users', function () {}); $app->get('products', function () {}); }); $app->group(['prefix' => 'v2'], function () use ($app) { $app->get('users', function () {}); $app->get('products', function () {}); }); }); Grupos de Rotas por Versão
  • 30. PACOTES ÚTEIS • Dingo/API • Zircote/Swagger-PHP • TymonDesigns/JWT-Auth • League - OAuth2 Server • League - Fractal • Ramsey - UUID
  • 31. DINGO/API • Negociação de Conteúdo • Múltiplos Adaptadores de Autenticação • Versionamento da API • Limitação de Requisições
  • 32. DINGO/API • Transformers and Formatters de Respostas • Handling de Exceptions e Erros • Requests Internos • Documentação Blueprint
  • 33. • Build APIs You Won't Hate • Heroku's HTTP API Design • Open API Initiative • Petstore (demo swagger) • 2-legged OAuth LIVROS E RECURSOS

Notas do Editor

  1. Questionário Já usou? Já desenvolveu? Quer desenvolver / está desenvolvendo? Explicação do tamanho da palestra Abelhas: APIcultura
  2. Tudo mesclado, não em ordem
  3. Principal skill ao desenvolver uma API: Empatia
  4. APIARY: api design tools
  5. UPS: United Parcel System maiores empresas de logística
  6. RAML, Blueprint Arquivo contém rotas, como fazer requisições e como são as respostas Demonstração >>> H <<< minimiza
  7. 1- ou não atualizará e logo servirá pra nada 2 - Clareza, evitar duplicação 3 - doctrine annotations!
  8. virará o arquivo swagger.json ao rodar o comando
  9. pensando em não duplicar info, fiz o script
  10. facilidade de geração
  11. Sempre use o bom senso Fallbacks (volta o campo velho e o novo) Marcar deprecated nos metadados
  12. ao invés de loopar no model castando pra bool / int
  13. virará o arquivo swagger.json ao rodar o comando
  14. _method para os navegadores, que só usam GET e POST Preciso suportar XML? CSV? etc? Não! somente deixe documentado
  15. se quiser, ponha um link para uma descrição do erro em alguma documentação API BUC boolean ativo
  16. se quiser, ponha um link para uma descrição do erro em alguma documentação API BUC boolean ativo
  17. API SPTrans (404, 405 (post), login) Problemas em auth com cookie: Android / iOS se alguém do sptrans ver essa talk, melhora isso! (só lembra de fazer na v2, pra não quebrar quem já tá usando)
  18. Problemas em auth com cookie: Android / iOS se alguém do sptrans ver essa talk, melhora isso! (só lembra de fazer na v2, pra não quebrar quem já tá usando)
  19. UUID
  20. Facilidade migração lumen > laravel
  21. virará o arquivo swagger.json ao rodar o comando
  22. 1- Phil Sturgeon - escrevendo v2 (twitter) 2 - Começou como um trabalho do Heroku 3 - Open API / Swagger