#!/usr/bin/env pinpoint
# default style
[../_images/Seascapeshd - 2.png]
[font=Sans 40px]
[fill]
[center]
[text-align=center]
# [shading-opacity=0.0]
[text-color=white]
[text-align=left]
[duration=0]
# presentation starts here
--- [font=Sans 100px] [text-align=center]
ReST
Representational State Transfer
---
• Criado por Roy Fielding em 2000.
• Fielding trabalhou na definição do HTTP e no início do projeto Apache.
--- [font=Sans 90px] [../_images/l-What-is-this-sorcery.jpg]
O que é ReST?
--- [../_images/l-What-is-this-sorcery.jpg]
É uma "arquitetura" de transmissão de dados, basicamente.
(Conjunto de idéias para utilizar HTTP para geração de APIs.)
--- [../_images/l-What-is-this-sorcery.jpg]
Linguagem? Qualquer!
Python: Flask, Django, Flask-Restless, Django Rest Framework
Ruby: Ruby on Rails, Sinatra
Java: Spring, Restlet, Jersey
C#: Ramone
Nodejs: Express
--- [font=Sans 90px] [../_images/20090504102402_dsc_2864 (1).jpg]
ReST e HTTP
--- [../_images/20090504102402_dsc_2864 (1).jpg]
• Métodos HTTP = operação de banco de dados (CRUD).
• Status das operações são status HTTP.
• Meta-informações podem ser enviadas nos headers.
• Autenticação é feita por HTTP Basic Auth (preferencialmente).
• Sem transações/sessões -- todas as operações são atômicas.
--- [../_images/20090504102402_dsc_2864 (1).jpg]
Em HTTP, usam-se "métodos" para descrever o que quer ser feito:
• POST requisita informações, com conteúdo.
• GET requisita informações, sem conteúdo.
(Ainda: PUT, DELETE, HEAD, TRACE, PATCH.)
--- [../_images/20090504102402_dsc_2864 (1).jpg]
Em ReST, métodos HTTP viram CRUD:
• Create = POST
• Retrieve = GET
• Update = PUT
• Delete = DELETE
--- [font=Sans 90px] [../_images/jellybeans.jpg]
Recursos
--- [../_images/jellybeans.jpg]
• Em ReST, "tabelas" chamadas são "recursos".
• (Até porque o "R" de "URL" é "resource")
• Sempre substantivos singulares.
• Existem duas URLs por recurso:
• Uma para o conjunto;
• Uma para elementos específicos.
--- [../_images/jellybeans.jpg]
GET /recurso/ ⇒ retorna todos os elementos do recurso.
POST /recurso/ ⇒ cria um novo elemento.
PUT /recurso/ ⇒ atualização em massa.
DELETE /recurso/ ⇒ remove todos os elementos do recurso.
--- [../_images/jellybeans.jpg]
GET /recurso/id ⇒ retorna informações do elemento com identificador "id".
POST /recurso/id ⇒ não faz sentido, use POST /recurso/ para criar elementos.
PUT /recurso/id ⇒ atualiza informações do elemento.
DELETE /recurso/id ⇒ Remove um elemento.
--- [../_images/jellybeans.jpg]
Exemplos:
GET /users/ ⇒ Retorna a lista de todos os usuários.
POST /users/ ⇒ Cria um novo usuário.
GET /users/1 ⇒ Retorna as informações do com identificador "1".
PUT /users/1 ⇒ Atualiza informações do usuário "1".
DELETE /users/1 ⇒ Remove o usuário "1".
--- [../_images/jellybeans.jpg]
Requisições sem recurso são definidas por verbos e GET:
GET /convert/?source=BRL&value=10&target=AUD
--- [font=Sans 90px] [../_images/content-strategy.jpg]
Conteúdo
--- [../_images/content-strategy.jpg]
Qualquer formato, ReST não define um tipo específico.
• Pode ser XML
• Pode ser JSON
• Pode ser HTML puro
Decisão fica a cargo da equipe.
--- [font=Sans 90px] [../_images/RightWrongBlackboard.jpg]
Status
--- [../_images/RightWrongBlackboard.jpg]
HTTP status:
• 200 OK ⇒ operação concluída com sucesso.
• 400 Bad Request ⇒ algo de errado com a requisição.
• 403 Forbidden ⇒ sem permissão de acesso ao recurso ou elemento.
• 404 Not Found ⇒ recurso ou elemento não existe.
• 405 Method Not Allowed ⇒ método inválido para recurso/elemento.
• 406 Not Acceptable ⇒ algum parâmetro não faz sentido.
• 409 Conflict ⇒ conflito de opções.
E assim por diante, mais informações podem ser enviadas no corpo
da resposta.
--- [../_images/RightWrongBlackboard.jpg]
Infelizmente, ReST não define o que em fazer casos de conflitos.
--- [../_images/RightWrongBlackboard.jpg]
Exemplo:
Adicionar um usuário a um grupo:
• 404 se o grupo não existir (PUT /group/1001)
• O que retornar se o usuário (dentro do conteúdo) não existir?
--- [font=Sans 90px] [../_images/house-do-want_cut455_22k.jpg]
Por que ReST?
--- [../_images/house-do-want_cut455_22k.jpg]
• Reaproveita toda a estrutura de HTTP existente.
• HTTP praticamente padrão em todas as linguagens.
• Dificilmente HTTP (porta 80) é bloqueado em proxies.
• "Sintaxe" simples.
--- [font=Sans 90px] [../_images/Luke-Derp.jpg]
Por que não ReST?
--- [../_images/Luke-Derp.jpg] [bottom] [font=Sans 20px]
--- [../_images/Luke-Derp.jpg] [bottom] [font=Sans 20px]
(Slide intencionalmente deixando em branco.)
--- [../_images/Luke-Derp.jpg]
• Segurança depende de terceiros (HTTPS).
• Existem outras opções (OAuth, por exemplo), mas são complexas
e não se parecem com soluções HTTP.
• Não recomedado para dispositivos com processamento e memória
extremamente limitados.
• Necessidade de sessões/transações.
• Requisito não é um serviço.
--- [../_images/Luke-Derp.jpg] [bottom] [font=Sans 20px]
(Slide intencionalmente deixando em branco -- de novo.)
--- [../_images/thats-all-folks.jpg]
--- [../_images/thats-all-folks.jpg] [bottom]
Perguntas?
--- [../_images/thats-all-folks.jpg] [bottom]
Hangout: julio.biason@gmail.com
Twitter: @juliobiason
Email: julioandre@cwi.com.br