|
|
|
#!/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]
|
|
|
|
|
|
|
|
<big><b>ReST</b></big>
|
|
|
|
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]
|
|
|
|
|
|
|
|
<b>O que é ReST?</b>
|
|
|
|
|
|
|
|
--- [../_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]
|
|
|
|
|
|
|
|
<b>ReST e HTTP</b>
|
|
|
|
|
|
|
|
--- [../_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]
|
|
|
|
|
|
|
|
<b>Recursos</b>
|
|
|
|
|
|
|
|
--- [../_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]
|
|
|
|
|
|
|
|
<tt>GET /recurso/</tt> ⇒ retorna todos os elementos do recurso.
|
|
|
|
<tt>POST /recurso/</tt> ⇒ cria um novo elemento.
|
|
|
|
<tt>PUT /recurso/</tt> ⇒ atualização em massa.
|
|
|
|
<tt>DELETE /recurso/</tt> ⇒ remove todos os elementos do recurso.
|
|
|
|
|
|
|
|
--- [../_images/jellybeans.jpg]
|
|
|
|
|
|
|
|
<tt>GET /recurso/id</tt> ⇒ retorna informações do elemento com identificador "id".
|
|
|
|
<tt>POST /recurso/id</tt> ⇒ não faz sentido, use <tt>POST /recurso/</tt> para criar elementos.
|
|
|
|
<tt>PUT /recurso/id</tt> ⇒ atualiza informações do elemento.
|
|
|
|
<tt>DELETE /recurso/id</tt> ⇒ Remove um elemento.
|
|
|
|
|
|
|
|
--- [../_images/jellybeans.jpg]
|
|
|
|
|
|
|
|
Exemplos:
|
|
|
|
|
|
|
|
<tt>GET /users/</tt> ⇒ Retorna a lista de todos os usuários.
|
|
|
|
<tt>POST /users/</tt> ⇒ Cria um novo usuário.
|
|
|
|
|
|
|
|
<tt>GET /users/1</tt> ⇒ Retorna as informações do com identificador "1".
|
|
|
|
<tt>PUT /users/1</tt> ⇒ Atualiza informações do usuário "1".
|
|
|
|
<tt>DELETE /users/1</tt> ⇒ Remove o usuário "1".
|
|
|
|
|
|
|
|
--- [../_images/jellybeans.jpg]
|
|
|
|
|
|
|
|
Requisições sem recurso são definidas por verbos e GET:
|
|
|
|
|
|
|
|
<tt>GET /convert/?source=BRL&value=10&target=AUD</tt>
|
|
|
|
|
|
|
|
--- [font=Sans 90px] [../_images/content-strategy.jpg]
|
|
|
|
|
|
|
|
<b>Conteúdo</b>
|
|
|
|
|
|
|
|
--- [../_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]
|
|
|
|
|
|
|
|
<b>Status</b>
|
|
|
|
|
|
|
|
--- [../_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 (<tt>PUT /group/1001</tt>)
|
|
|
|
• O que retornar se o usuário (dentro do conteúdo) não existir?
|
|
|
|
|
|
|
|
--- [font=Sans 90px] [../_images/house-do-want_cut455_22k.jpg]
|
|
|
|
|
|
|
|
<b>Por que ReST?</b>
|
|
|
|
|
|
|
|
--- [../_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]
|
|
|
|
|
|
|
|
<b>Por que não ReST?</b>
|
|
|
|
|
|
|
|
--- [../_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
|