SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
REST-fuuuu
RESTful e a polícia do HTTP
Igor Santos who?
- Desenvolvedor PHP desde os 16 (~10 anos)
- Trabalho com APIs REST: ~4 anos
- Desenvolvedor React: ~2 ano
- Já mexi com Ruby, mas...
- Já brinquei com C e Python mas…
- Já me diverti com Ember mas…
Atualmente, sou Freelancer remoto Full-stack na
Join the network! Talk to me :D
Remoto.
MESMO.
RESTful
RESTful……who?
REpresentational
State
Transfer
-ful: completo, pleno
Normalmente (sempre?) baseado em HTTP(S)
RESTful……who?
Martin Fowler & Leonard Richardson, 2010: Steps toward the glory of REST
RESTful……who?
Martin Fowler & Leonard Richardson, 2010: Steps toward the glory of REST
Zoeira
REST de verdade
#0: O pântano do POX*
✓ Comunicação sobre o HTTP
✗ HTTP = protocolo facilitador de rede, somente
✗ Verbos HTTP? GETPOST all the things!
*POX: Plain Old XML
#0: O pântano do POX* *POX: Plain Old XML
#0: O pântano do POX* *POX: Plain Old XML
POST /api/
<listEvents date="2016-10-22"/>
----------------------------------------
HTTP/1.1 200 OK
<eventsList>
<event id="10">
<dates begin="2016-10-22">
<topics>
<topic>HTTP</topic>
<topic>REST</topic>
</topics>
[...]
#0: O pântano do POJ* *POJ: Pure and Old JSON
POST /api/?method=events.list
{ date: "2015-10-22" }
----------------------------------------
HTTP/1.1 200 OK
[
{
"id": 10,
"start": "2015-10-22",
"topics": [ "PHP", "REST" ],
"speakers": [
{
...
#1: Resources!
✓ Comunicação sobre o HTTP
✓ URIs indicam o recurso desejado
✓ Recursos HTTP simplificados, para dividir os requests
✗ Verbos HTTP? GETPOST all the things!
AKA entidades
#1: Resources RPC!
POST /api/events
{ "method": "list", date: "2015-10-22" }
----------------------------------------
HTTP/1.1 200 OK
[
{
"id": 10,
"start": "2015-10-22",
"topics": [ "HTTP", "REST" ],
"speakers": [
{
...
#1: Resources RPC!
POST /api/events/search
{ date: "2015-10-22" }
----------------------------------------
HTTP/1.1 200 OK
[
{
"id": 10,
"start": "2015-10-22",
"topics": [ "PHP", "REST" ],
"speakers": [
{
...
#2: Eu chamo API, tu chamas API...
✓ Comunicação sobre o HTTP
✓ URIs indicam o recurso desejado
✓ Recursos HTTP dividem os requests
✓ Verbos HTTP dividem as operações
#2: Eu chamo API, tu chamas API...
Subníveis de uso dos Verbos HTTP
GET POST PUT DELETE
Básico Consultas
Criação
Edição
Remoção
X X
POST /clientes/buscar
GET /clientes
#2: Eu chamo API, tu chamas API...
Subníveis de uso dos Verbos HTTP
GET POST PUT DELETE
Básico Consultas
Criação
Edição
Remoção
X X
Quase lá Consultas
Criação
Edição
X Remoção
POST /clientes/apagar/2
DELETE /clientes/2
#2: Eu chamo API, tu chamas API...
Subníveis de uso dos Verbos HTTP
GET POST PUT DELETE
Básico Consultas
Criação
Edição
Remoção
X X
Quase lá Consultas
Criação
Edição
X Remoção
RESTful-ish Consultas Criação Edição Remoção
POST /clientes/edit/27
PUT /clientes/27
#2: Eu chamo API, tu chamas API...
Subníveis de uso dos Verbos HTTP
GET POST PUT DELETE PATCH
Básico Consultas
Criação
Edição
Remoção
X X X
Quase lá Consultas
Criação
Edição
X Remoção X
RESTful-ish Consultas Criação Edição Remoção X
RESTful-ish
bônus
Consultas Criação Edição Remoção
Edição
parcial
#2: Eu chamo API, tu chamas API...
Subníveis de uso dos Verbos HTTP
GET POST PUT DELETE PATCH
Básico Consultas
Criação
Edição
Remoção
X X X
Quase lá Consultas
Criação
Edição
X Remoção X
RESTful-ish Consultas Criação Edição Remoção X
RESTful-ish
bônus
Consultas Criação Edição Remoção
Edição
parcial
RESTful-ish
bônus plus
Além dos verbos certos,
usa os códigos HTTP e headers corretos
#2: Eu chamo API, tu chamas API...
GET /api/events?date=2016-10-22
----------------------------------------
HTTP/1.1 200 OK
[
{
"id": 10,
"start": "2016-10-22",
"topics": [ "HTTP", "REST" ],
"speakers": [
{
...
#2: Eu chamo API, tu chamas API...
POST /api/events
{ "start": "2016-10-22", ... }
----------------------------------------
HTTP/1.1 201 Created
[
{
"id": 10,
"start": "2016-10-22",
"topics": [ "HTTP", "REST" ],
"speakers": [
{
...
#2: Eu chamo API, tu chamas API...
DELETE /api/events/10
----------------------------------------
HTTP/1.1 204 No Content
#2.5: RESTful-ish
1. Códigos HTTP
- 200: OK, tá aqui o que você pediu
- 201: Criei, olha aqui o que eu fiz
- 204: Funcionou, mas não tenho mais nada pra te dizer
- 400: erro genérico do usuário
- 401: OW, quem é você?
- 403: OW, sei quem é você mas isso aqui não é pro teu bico
- 404: tem nada disso aqui não
- 405: verbo incorreto
- 406: não consigo gerar no formato que você quer
- 422: sabe nem escreve direito, mano
- 500: CORRÃO PARA AS MONTANHAS
- 501: não sei fazer isso não
Árvore de
decisão
de códigos HTTP
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
#2.5: RESTful-ish
Stateless, formats, versioning...
#2.5: RESTful-ish
2. Stateful
- HTTP = stateless
- Stateless <> sessão
#2.5: RESTful-ish
2. Stateful
- HTTP = stateless
- Stateless <> sessão
- API <3 sessão
- API + HTTP + sessão =
- HTTP Auth: autentica o usuário inicialmente
- HTTP Cookie - re-identifica o usuário, tornando
desnecessário re-autenticar a cada novo request
#2.5: RESTful-ish
2. Stateful
- HTTP = stateless
- Stateless <> sessão
- API <3 sessão
- API + HTTP + sessão =
- HTTP Cookie: inseguro no geral
- HTTP Auth: autentica o usuário inicialmente
- JSON Web Token: mantém o estado do lado do
cliente de modo seguro, livrando o servidor disso
#2.5: RESTful-ish
3. Formatos de resposta
- Método A: header HTTP Accept: text/xml
- Método B: extensão na URI: /events.json
- O correto: aceitar os dois métodos, e responder
em XML e JSON
- O mais comum: um dos dois métodos - ou nenhum,
e responder em JSON (mais leve de implementar e
interpretar)
#2.5: RESTful-ish
4. Versionamento da API
- Método A: incluído na URL
- Método B: header HTTP customizado
- Método C: incluído no header Accept
- O correto: nenhum
- O mais comum: na URL - mais fácil de implementar dos
dois lados e associa diretamente o método, o resource e
a resposta à disponibilidade destes na API
#2.5: RESTful-ish
4. Versionamento da API
- Método A: incluído na URL
- Método B: header HTTP customizado
- Método C: incluído no header Accept
- O correto: nenhum
- O mais comum: na URL - mais fácil de implementar dos
dois lados e associa diretamente o método, o resource e
a resposta à disponibilidade destes na API
#3: HATEOAS
Hypermedia
As
The
Engine
Of
Application
State
#3: HATEOAS
Links definem como se mover
dentro da API.
Em teoria, permitiria aplicações
automatizadas, consumidoras
de APIs.
#3: HATEOAS
Links definem como se mover
dentro da API.
Na prática, pode ser usado para
automatizar certas atividades
numa aplicação.
#3: HATEOAS
JSON API Spec
- Uma especificação de verdade para APIs!
#3: HATEOAS
JSON API Spec
- Uma especificação de verdade para APIs!
- Bem completa, complexa mas bem poderosa
- Dá pra fazer um monte de coisas com ela
- Muito legal <3
#3: HATEOAS
JSON API Spec
- Uma especificação de verdade para APIs!
- Bem completa, complexa mas bem poderosa
- Paginação e navegação entre recursos
- Requisição de recursos relacionados no mesmo payload
- Meta informações sobre o request
- Formato definido entre requests de uma única ou múltiplas
entradas, dados de identificação
e atributos, relacionamentos, etc
Comofas/
*altamente opinativo!
Library recomendada: Restler
Classes puras + ORM + Restler = API RESTful e documentada
OUTDATED
Library recomendada: Restler
Classes puras + ORM + Restler = API RESTful e documentada
- Curva de aprendizado ≅ 0
- Muito leve; configuração flexível e customizável
- Features baseadas nas próprias features do OO e PHPDoc (assim
como o REST é baseado no HTTP, ahá!), como validação,
documentação, rotas customizadas, códigos de retorno, etc
- Suporta Rate limiting e OAuth 2
- Suporta respostas em JSON, XML, YAML, Plist e Amf
- Documentação automática e muito boa (Swagger)
OUTDATED
Library recomendada: Restler
Classes puras + ORM + Restler = API RESTful e documentada
Documentação
Código
- Word
- User
Exemplo prático:
OUTDATED
Framework recomendado: Laravel/Lumen
Resources automatizados em Controllers + framework
- Frameworks simplificados, e componentizados
- Bem leve
- Configuração flexível e customizável
- ORM poderoso já embutido
- Diversas outras ferramentas integradas, como
queues, events, logs, encriptação, validação, etc
Framework recomendado: Laravel/Lumen
Resources automatizados em Controllers + framework
Pattern não-recomendado: closures
Pattern não-recomendado: closures
Pattern recomendado para comprar seu ticket para o inferno
Testes?
Quer avaliar se a
API tá funcionando
como devia?
Postman
for the rescue!
Ou Apiary .
Se perdeu?
Tá faltando
documentação?
Swagger,
API Blueprint,
Apiary, RAML,
Postman,
etc.
Learn more about the
opportunities, come talk to me :)
Do you speak English?
Do you feel you’re great at what you do?
Looking for good clients, great pay, awesome teams and freedom?
That’s all,
folks!
- Richardson’s API Maturity Model
- API versioning discussion
- HTTP Headers spec
- HTTP Verbs: Wikipedia / Spec
- JSON API spec
- Postman
- Toptal Engineering Blog
*.com/igorsantos07
*.com/igorsantos07
*.com/in/igorsantos07
Portfolio: freelancer.igorsantos.com.br
Apply: toptal.igorsantos.com.br
That’s all,
folks!
Peço desculpas por todas as piadas
e trocadilhos ruins usados nesta
palestra. Carlos Alberto de Nóbrega
não esteve envolvido com a
mesma.
*.com/igorsantos07
*.com/igorsantos07
*.com/in/igorsantos07
Portfolio: freelancer.igorsantos.com.br
Apply: toptal.igorsantos.com.br

Mais conteúdo relacionado

Mais procurados

Mais procurados (17)

PHP para aplicações Web de grande porte
PHP para aplicações Web  de grande portePHP para aplicações Web  de grande porte
PHP para aplicações Web de grande porte
 
PHP RESTful Web Services
PHP RESTful Web ServicesPHP RESTful Web Services
PHP RESTful Web Services
 
REST Web Services com Java
REST Web Services com JavaREST Web Services com Java
REST Web Services com Java
 
Conceitos básicos PHP
Conceitos básicos PHPConceitos básicos PHP
Conceitos básicos PHP
 
Primeira Aula PHP
Primeira Aula PHPPrimeira Aula PHP
Primeira Aula PHP
 
CURSO DE PHP PARA INICIANTES - AULA 1
CURSO DE PHP PARA INICIANTES - AULA 1CURSO DE PHP PARA INICIANTES - AULA 1
CURSO DE PHP PARA INICIANTES - AULA 1
 
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)Curso Desenvolvimento WEB com PHP - PHP (parte 1)
Curso Desenvolvimento WEB com PHP - PHP (parte 1)
 
Python cherrypy
Python cherrypyPython cherrypy
Python cherrypy
 
Mini Curso de PHP
Mini Curso de PHPMini Curso de PHP
Mini Curso de PHP
 
Aula WebCrawlers com Regex - PyCursos
Aula WebCrawlers com Regex - PyCursosAula WebCrawlers com Regex - PyCursos
Aula WebCrawlers com Regex - PyCursos
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
Minicurso PHP básico
Minicurso PHP básicoMinicurso PHP básico
Minicurso PHP básico
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Python
 
O que há de novo no PHP 5.3
O que há de novo no PHP 5.3O que há de novo no PHP 5.3
O que há de novo no PHP 5.3
 
Shell Script - Controle de fluxo
Shell Script - Controle de fluxoShell Script - Controle de fluxo
Shell Script - Controle de fluxo
 

Semelhante a REST-fuuuu - Boas práticas RESTful [PHPeste 2017]

Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-endIgor Santos
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09Felipe Ribeiro
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfBrunoAlbuquerque864673
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfBrunoAlbuquerque864673
 
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
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito CertoRavan Scafi
 
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiInterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiiMasters
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONMario Guedes
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyGilson Filho
 
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e VarnishEscalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e VarnishLucas Brasilino
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTArrayOf.io
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTMario Guedes
 
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
 

Semelhante a REST-fuuuu - Boas práticas RESTful [PHPeste 2017] (20)

Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-end
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Rest
RestRest
Rest
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdf
 
REST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdfREST vs GraphQL - A batalha das APIs.pdf
REST vs GraphQL - A batalha das APIs.pdf
 
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
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito Certo
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan ScafiInterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
InterCon 2017 - Design Coerente: decisões de tecnologia para APIs - Ravan Scafi
 
Integrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSONIntegrando sua App ao Mundo via REST/JSON
Integrando sua App ao Mundo via REST/JSON
 
REST com Python
REST com PythonREST com Python
REST com Python
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
 
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e VarnishEscalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
Escalabilidade e performance da infraestrutura Plone/Zope com CacheFU e Varnish
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Entendendo HTTP para entender o REST
Entendendo HTTP para entender o RESTEntendendo HTTP para entender o REST
Entendendo HTTP para entender o REST
 
Web apis
Web apisWeb apis
Web apis
 
AspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performanceAspNet 5 & Redis - Escalando sua performance
AspNet 5 & Redis - Escalando sua performance
 

REST-fuuuu - Boas práticas RESTful [PHPeste 2017]

  • 1. REST-fuuuu RESTful e a polícia do HTTP
  • 2. Igor Santos who? - Desenvolvedor PHP desde os 16 (~10 anos) - Trabalho com APIs REST: ~4 anos - Desenvolvedor React: ~2 ano - Já mexi com Ruby, mas... - Já brinquei com C e Python mas… - Já me diverti com Ember mas… Atualmente, sou Freelancer remoto Full-stack na Join the network! Talk to me :D
  • 6. RESTful……who? Martin Fowler & Leonard Richardson, 2010: Steps toward the glory of REST
  • 7. RESTful……who? Martin Fowler & Leonard Richardson, 2010: Steps toward the glory of REST Zoeira REST de verdade
  • 8. #0: O pântano do POX* ✓ Comunicação sobre o HTTP ✗ HTTP = protocolo facilitador de rede, somente ✗ Verbos HTTP? GETPOST all the things! *POX: Plain Old XML
  • 9. #0: O pântano do POX* *POX: Plain Old XML
  • 10. #0: O pântano do POX* *POX: Plain Old XML POST /api/ <listEvents date="2016-10-22"/> ---------------------------------------- HTTP/1.1 200 OK <eventsList> <event id="10"> <dates begin="2016-10-22"> <topics> <topic>HTTP</topic> <topic>REST</topic> </topics> [...]
  • 11. #0: O pântano do POJ* *POJ: Pure and Old JSON POST /api/?method=events.list { date: "2015-10-22" } ---------------------------------------- HTTP/1.1 200 OK [ { "id": 10, "start": "2015-10-22", "topics": [ "PHP", "REST" ], "speakers": [ { ...
  • 12. #1: Resources! ✓ Comunicação sobre o HTTP ✓ URIs indicam o recurso desejado ✓ Recursos HTTP simplificados, para dividir os requests ✗ Verbos HTTP? GETPOST all the things! AKA entidades
  • 13. #1: Resources RPC! POST /api/events { "method": "list", date: "2015-10-22" } ---------------------------------------- HTTP/1.1 200 OK [ { "id": 10, "start": "2015-10-22", "topics": [ "HTTP", "REST" ], "speakers": [ { ...
  • 14. #1: Resources RPC! POST /api/events/search { date: "2015-10-22" } ---------------------------------------- HTTP/1.1 200 OK [ { "id": 10, "start": "2015-10-22", "topics": [ "PHP", "REST" ], "speakers": [ { ...
  • 15. #2: Eu chamo API, tu chamas API... ✓ Comunicação sobre o HTTP ✓ URIs indicam o recurso desejado ✓ Recursos HTTP dividem os requests ✓ Verbos HTTP dividem as operações
  • 16. #2: Eu chamo API, tu chamas API... Subníveis de uso dos Verbos HTTP GET POST PUT DELETE Básico Consultas Criação Edição Remoção X X POST /clientes/buscar GET /clientes
  • 17. #2: Eu chamo API, tu chamas API... Subníveis de uso dos Verbos HTTP GET POST PUT DELETE Básico Consultas Criação Edição Remoção X X Quase lá Consultas Criação Edição X Remoção POST /clientes/apagar/2 DELETE /clientes/2
  • 18. #2: Eu chamo API, tu chamas API... Subníveis de uso dos Verbos HTTP GET POST PUT DELETE Básico Consultas Criação Edição Remoção X X Quase lá Consultas Criação Edição X Remoção RESTful-ish Consultas Criação Edição Remoção POST /clientes/edit/27 PUT /clientes/27
  • 19. #2: Eu chamo API, tu chamas API... Subníveis de uso dos Verbos HTTP GET POST PUT DELETE PATCH Básico Consultas Criação Edição Remoção X X X Quase lá Consultas Criação Edição X Remoção X RESTful-ish Consultas Criação Edição Remoção X RESTful-ish bônus Consultas Criação Edição Remoção Edição parcial
  • 20. #2: Eu chamo API, tu chamas API... Subníveis de uso dos Verbos HTTP GET POST PUT DELETE PATCH Básico Consultas Criação Edição Remoção X X X Quase lá Consultas Criação Edição X Remoção X RESTful-ish Consultas Criação Edição Remoção X RESTful-ish bônus Consultas Criação Edição Remoção Edição parcial RESTful-ish bônus plus Além dos verbos certos, usa os códigos HTTP e headers corretos
  • 21. #2: Eu chamo API, tu chamas API... GET /api/events?date=2016-10-22 ---------------------------------------- HTTP/1.1 200 OK [ { "id": 10, "start": "2016-10-22", "topics": [ "HTTP", "REST" ], "speakers": [ { ...
  • 22. #2: Eu chamo API, tu chamas API... POST /api/events { "start": "2016-10-22", ... } ---------------------------------------- HTTP/1.1 201 Created [ { "id": 10, "start": "2016-10-22", "topics": [ "HTTP", "REST" ], "speakers": [ { ...
  • 23. #2: Eu chamo API, tu chamas API... DELETE /api/events/10 ---------------------------------------- HTTP/1.1 204 No Content
  • 24. #2.5: RESTful-ish 1. Códigos HTTP - 200: OK, tá aqui o que você pediu - 201: Criei, olha aqui o que eu fiz - 204: Funcionou, mas não tenho mais nada pra te dizer - 400: erro genérico do usuário - 401: OW, quem é você? - 403: OW, sei quem é você mas isso aqui não é pro teu bico - 404: tem nada disso aqui não - 405: verbo incorreto - 406: não consigo gerar no formato que você quer - 422: sabe nem escreve direito, mano - 500: CORRÃO PARA AS MONTANHAS - 501: não sei fazer isso não
  • 28. #2.5: RESTful-ish 2. Stateful - HTTP = stateless - Stateless <> sessão
  • 29. #2.5: RESTful-ish 2. Stateful - HTTP = stateless - Stateless <> sessão - API <3 sessão - API + HTTP + sessão = - HTTP Auth: autentica o usuário inicialmente - HTTP Cookie - re-identifica o usuário, tornando desnecessário re-autenticar a cada novo request
  • 30. #2.5: RESTful-ish 2. Stateful - HTTP = stateless - Stateless <> sessão - API <3 sessão - API + HTTP + sessão = - HTTP Cookie: inseguro no geral - HTTP Auth: autentica o usuário inicialmente - JSON Web Token: mantém o estado do lado do cliente de modo seguro, livrando o servidor disso
  • 31. #2.5: RESTful-ish 3. Formatos de resposta - Método A: header HTTP Accept: text/xml - Método B: extensão na URI: /events.json - O correto: aceitar os dois métodos, e responder em XML e JSON - O mais comum: um dos dois métodos - ou nenhum, e responder em JSON (mais leve de implementar e interpretar)
  • 32. #2.5: RESTful-ish 4. Versionamento da API - Método A: incluído na URL - Método B: header HTTP customizado - Método C: incluído no header Accept - O correto: nenhum - O mais comum: na URL - mais fácil de implementar dos dois lados e associa diretamente o método, o resource e a resposta à disponibilidade destes na API
  • 33. #2.5: RESTful-ish 4. Versionamento da API - Método A: incluído na URL - Método B: header HTTP customizado - Método C: incluído no header Accept - O correto: nenhum - O mais comum: na URL - mais fácil de implementar dos dois lados e associa diretamente o método, o resource e a resposta à disponibilidade destes na API
  • 35. #3: HATEOAS Links definem como se mover dentro da API. Em teoria, permitiria aplicações automatizadas, consumidoras de APIs.
  • 36. #3: HATEOAS Links definem como se mover dentro da API. Na prática, pode ser usado para automatizar certas atividades numa aplicação.
  • 37. #3: HATEOAS JSON API Spec - Uma especificação de verdade para APIs!
  • 38. #3: HATEOAS JSON API Spec - Uma especificação de verdade para APIs! - Bem completa, complexa mas bem poderosa - Dá pra fazer um monte de coisas com ela - Muito legal <3
  • 39. #3: HATEOAS JSON API Spec - Uma especificação de verdade para APIs! - Bem completa, complexa mas bem poderosa - Paginação e navegação entre recursos - Requisição de recursos relacionados no mesmo payload - Meta informações sobre o request - Formato definido entre requests de uma única ou múltiplas entradas, dados de identificação e atributos, relacionamentos, etc
  • 41. Library recomendada: Restler Classes puras + ORM + Restler = API RESTful e documentada OUTDATED
  • 42. Library recomendada: Restler Classes puras + ORM + Restler = API RESTful e documentada - Curva de aprendizado ≅ 0 - Muito leve; configuração flexível e customizável - Features baseadas nas próprias features do OO e PHPDoc (assim como o REST é baseado no HTTP, ahá!), como validação, documentação, rotas customizadas, códigos de retorno, etc - Suporta Rate limiting e OAuth 2 - Suporta respostas em JSON, XML, YAML, Plist e Amf - Documentação automática e muito boa (Swagger) OUTDATED
  • 43. Library recomendada: Restler Classes puras + ORM + Restler = API RESTful e documentada Documentação Código - Word - User Exemplo prático: OUTDATED
  • 44. Framework recomendado: Laravel/Lumen Resources automatizados em Controllers + framework - Frameworks simplificados, e componentizados - Bem leve - Configuração flexível e customizável - ORM poderoso já embutido - Diversas outras ferramentas integradas, como queues, events, logs, encriptação, validação, etc
  • 45. Framework recomendado: Laravel/Lumen Resources automatizados em Controllers + framework
  • 47. Pattern não-recomendado: closures Pattern recomendado para comprar seu ticket para o inferno
  • 48. Testes? Quer avaliar se a API tá funcionando como devia? Postman for the rescue! Ou Apiary .
  • 49. Se perdeu? Tá faltando documentação? Swagger, API Blueprint, Apiary, RAML, Postman, etc.
  • 50. Learn more about the opportunities, come talk to me :) Do you speak English? Do you feel you’re great at what you do? Looking for good clients, great pay, awesome teams and freedom?
  • 51. That’s all, folks! - Richardson’s API Maturity Model - API versioning discussion - HTTP Headers spec - HTTP Verbs: Wikipedia / Spec - JSON API spec - Postman - Toptal Engineering Blog *.com/igorsantos07 *.com/igorsantos07 *.com/in/igorsantos07 Portfolio: freelancer.igorsantos.com.br Apply: toptal.igorsantos.com.br
  • 52. That’s all, folks! Peço desculpas por todas as piadas e trocadilhos ruins usados nesta palestra. Carlos Alberto de Nóbrega não esteve envolvido com a mesma. *.com/igorsantos07 *.com/igorsantos07 *.com/in/igorsantos07 Portfolio: freelancer.igorsantos.com.br Apply: toptal.igorsantos.com.br