Browse Source

rest now in the new format

master
Julio Biason 11 years ago
parent
commit
9eff2718a1
  1. 48
      rest.html
  2. 210
      rest/rest.pin

48
rest-reveal/index.html → rest.html

@ -13,11 +13,11 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../reveal.js/css/reveal.min.css"> <link rel="stylesheet" href="http://cdn.jsdelivr.net/reveal.js/2.6.2/css/reveal.min.css">
<link rel="stylesheet" href="../reveal.js/css/theme/default.css" id="theme"> <link rel="stylesheet" href="http://cdn.jsdelivr.net/reveal.js/2.6.2/css/theme/default.css" id="theme">
<!-- For syntax highlighting --> <!-- For syntax highlighting -->
<link rel="stylesheet" href="../reveal.js/lib/css/zenburn.css"> <link rel="stylesheet" href="http://cdn.jsdelivr.net/reveal.js/2.6.2/lib/css/zenburn.css">
<!-- If the query includes 'print-pdf', include the PDF print sheet --> <!-- If the query includes 'print-pdf', include the PDF print sheet -->
<script> <script>
@ -25,13 +25,13 @@
var link = document.createElement( 'link' ); var link = document.createElement( 'link' );
link.rel = 'stylesheet'; link.rel = 'stylesheet';
link.type = 'text/css'; link.type = 'text/css';
link.href = '../reveal.js/css/print/pdf.css'; link.href = 'http://cdn.jsdelivr.net/reveal.js/2.6.2/css/print/pdf.css';
document.getElementsByTagName( 'head' )[0].appendChild( link ); document.getElementsByTagName( 'head' )[0].appendChild( link );
} }
</script> </script>
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="../reveal.js/lib/js/html5shiv.js"></script> <script src="reveal.js/lib/js/html5shiv.js"></script>
<![endif]--> <![endif]-->
<style> <style>
@ -61,10 +61,10 @@ img {
</ul> </ul>
</section> </section>
<section> <!-- data-background="../_images/l-What-is-this-sorcery.jpg"> --> <section> <!-- data-background="_images/l-What-is-this-sorcery.jpg"> -->
<section> <section>
<h2>O que é ReST?</h2> <h2>O que é ReST?</h2>
<img src='../_images/l-What-is-this-sorcery.jpg'></img> <img src='_images/l-What-is-this-sorcery.jpg'></img>
</section> </section>
<section> <section>
@ -96,7 +96,7 @@ img {
<section> <section>
<section> <section>
<h2>ReST e HTTP</h2> <h2>ReST e HTTP</h2>
<img src='../_images/20090504102402_dsc_2864 (1).jpg'></img> <img src='_images/20090504102402_dsc_2864 (1).jpg'></img>
</section> </section>
<section> <section>
@ -141,7 +141,7 @@ img {
<section> <section>
<section> <section>
<h2>Recursos</h2> <h2>Recursos</h2>
<img src='../_images/jellybeans.jpg'></img> <img src='_images/jellybeans.jpg'></img>
</section> </section>
<section> <section>
@ -204,7 +204,7 @@ img {
<section> <section>
<section> <section>
<h2>Conteúdo</h2> <h2>Conteúdo</h2>
<img src='../_images/content-strategy.jpg'></img> <img src='_images/content-strategy.jpg'></img>
</section> </section>
<section> <section>
@ -224,7 +224,7 @@ img {
<section> <section>
<section> <section>
<h2>Status</h2> <h2>Status</h2>
<img src='../_images/RightWrongBlackboard.jpg'></img> <img src='_images/RightWrongBlackboard.jpg'></img>
</section> </section>
<section> <section>
@ -265,7 +265,7 @@ img {
<section> <section>
<section> <section>
<h2>Por que usar ReST?</h2> <h2>Por que usar ReST?</h2>
<img src='../_images/house-do-want_cut455_22k.jpg'></img> <img src='_images/house-do-want_cut455_22k.jpg'></img>
</section> </section>
<section> <section>
@ -286,7 +286,7 @@ img {
<section> <section>
<section> <section>
<h2>Por que não usar ReST?</h2> <h2>Por que não usar ReST?</h2>
<img src='../_images/Luke-Derp.jpg'></img> <img src='_images/Luke-Derp.jpg'></img>
</section> </section>
<section> <section>
@ -310,7 +310,7 @@ img {
<section></section> <section></section>
</section> </section>
<section data-background='../_images/thats-all-folks.jpg'> <section data-background='_images/thats-all-folks.jpg'>
<section></section> <section></section>
<section class='semi-opaque'> <section class='semi-opaque'>
@ -320,8 +320,8 @@ img {
</div> </div>
</div> </div>
<script src="../reveal.js/lib/js/head.min.js"></script> <script src="http://cdn.jsdelivr.net/reveal.js/2.6.2/lib/js/head.min.js"></script>
<script src="../reveal.js/js/reveal.min.js"></script> <script src="http://cdn.jsdelivr.net/reveal.js/2.6.2/js/reveal.min.js"></script>
<script> <script>
@ -333,8 +333,8 @@ img {
history: true, history: true,
center: true, center: true,
theme: Reveal.getQueryHash().theme, // available themes are in /css/theme theme: 'night',
transition: Reveal.getQueryHash().transition || 'linear', // default/cube/page/concave/zoom/linear/fade/none transition: 'linear',
// Parallax scrolling // Parallax scrolling
// parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg', // parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
@ -342,12 +342,12 @@ img {
// Optional libraries used to extend on reveal.js // Optional libraries used to extend on reveal.js
dependencies: [ dependencies: [
{ src: '../reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } }, { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: '../reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '../reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }, { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '../reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: '../reveal.js/plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } }, { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
{ src: '../reveal.js/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } } { src: 'http://cdn.jsdelivr.net/reveal.js/2.6.2/plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
] ]
}); });

210
rest/rest.pin

@ -1,210 +0,0 @@
#!/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&amp;value=10&amp;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
Loading…
Cancel
Save