#!/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