SlideShare ist ein Scribd-Unternehmen logo
1 von 40
A Web é uma API
Osvaldo Santana Neto
... REST
Disclaimer para os mais experientes
Eu vou reapresentar o básico porque no
básico encontraremos os fundamentos.
A Web
No princípio
era a Web
Berners-Lee* 1:1
* Inventor da Web
World Wide Web
O que é?
• Resource (Recursos/Conteúdo/Documento)
• Representação (MIME Types: text/html, application/json)
• Endereçamento (Uniform Resource Locator)
• Protocolo (HTTP)
• Arquitetura Cliente/Servidores (browser & HTTP Server)
• Stateless
World Wide Web
“A Web é um conjunto de recursos, que podem ser acessados
por um cliente, localizados em algum local apontado por uma
URL (Unified Resource Locator). Uma representação desses
recursos serão servidos através do protocolo HTTP.”
Resources, URLs e Representação
• Resource vs Representação: documentos, streams, imagens, áudio, vídeo, etc
• Possuem um tipo associado (Content-Type) definido com um MIME type
• O mesmo resource pode ser representado com tipos diferentes
• Apontados por um localizador (URL)
• http://example.com/index.html
• Uma URL sempre aponta para um único resource. Uma lista de resources
é um resource do tipo lista de resources. Múltiplas URLs podem apontar
para o mesmo resource (uso de canonical URLs)
“Lembre-se: Resources e Models são
conceitos diferentes”
HTTP, Clientes e Servidores
• Protocolo HTTP
• Protocolo de comunicação Cliente/Servidor que opera na camada de Aplicação
• A primeira versão do HTTP é baseada em texto. As versões seguintes podem funcionar com dados binários
• Existe uma extensão que adiciona suporte a criptografia que é chamada HTTPS
• Clientes
• Existem vários tipos de clientes (User Agents). O mais conhecido é o navegador (browser)
• Os clientes usam HTTP para fazer requisições para um endereço onde tem um servidor Web
• Servidores
• O servidor Web recebe requisições feitas por clientes e devolvem os recursos solicitados usando também o protocolo
HTTP
• Por padrão, em redes TCP/IP, o servidor recebe as requisições através das portas 80 (http) ou 442 (https)
Request
Um cliente faz uma requisição para o servidor...
• O request especifica uma ação com um verbo. Existe um conjunto padronizado de verbos tais
como: GET, POST, PUT, DELETE, PATCH, etc
• O request especifica a URL do recurso desejado
• O request pode incluir outros detalhes sobre o tipo de resource ou como ele prefere receber
esse resource
• Usamos cabeçalhos do protocolo para esse propósito (ex. Accept)
• Você pode especificar qual a representação (MIME type) você quer ter do recurso
(Accept). Exemplo: text/html, application/json
• Content-Type especifica o formato da requisição. Accept especifica o formato que você
prefere a resposta. Você pode informar uma lista qualificada de MIME types
> GET /todos HTTP/1.1
> Host: todos.com
> User-Agent: …
> Accept: text/html
> GET /todos HTTP/1.1
> Host: todos.com
> User-Agent: …
> Accept: application/json
> GET /todos HTTP/1.1
> Host: todos.com
> User-Agent: …
> Accept: text/html;
q=0.2, application/json
Exemplos
• Todos os exemplos ao lado
solicitam um único resource com a
lista de todas as tarefas (TODO list)
• O terceiro exemplo requisita
preferencialmente o resource com
representação application/json mas
aceita text/html se for uma
alternativa viável para o servidor
• Você tem que lidar com respostas
300 Multiple Choices e 406 Not
Acceptable
Request
Response
... que devolve uma resposta para o cliente
• A resposta inicia com um código de status
• https://github.com/osantana/staty
• A resposta também inclui cabeçalhos HTTP com metadados da resposta (ex.
tipo de representação do conteúdo)
• Na sequência, dependendo do status code, recebemos o conteúdo do
resource representado com um dos formatos solicitados na requisição.
< HTTP/1.1 200 OK
< Cache-Control: [cache info]
< Content-Type: text/html
< Etag: [tag]
< Expires: [data]
< Last-Modified: [data]
<
< [HTML]
< HTTP/1.1 200 OK
< Cache-Control: [cache info]
< Content-Type: application/json
< Etag: [tag]
< Expires: [data]
< Last-Modified: [data]
<
< [JSON]
Exemplos
• Todos os exemplos ao lado
solicitam um único resource com a
lista de todas as tarefas (TODO list)
• O terceiro exemplo requisita
preferencialmente o resource com
representação application/json mas
aceita text/html se for uma
alternativa viável para o servidor
• Você tem que lidar com respostas
300 Multiple Choices e 406 Not
Acceptable
Response
HTML
Um tipo de representação para um resource
• Documentos Hipertexto
• Conceito já explorado na literatura desde a década de 40
• Marcações (tags) especificam a semântica do conteúdo
• Content Type (MIME type: text/html)
• Linguagem de marcação subset do SGML
• Suporte a hiperlinks
• Clientes do tipo Web Browser sabem renderizar esses documentos
• Usam CSS e JS para especificar visual e comportamento
• Pode ser gerado por um renderizados de linguagem de template.
As APIs
HTTP
HTTP como transporte
• RPC
• XMLRPC
• SOAP
• gRPC
• CORBA
• 🙄
• Vamos pular isso aqui...
REST e a Web
somos um
Roy Fielding* 10:30
* Um dos criadores da especificação
HTTP e co-fundador da Apache
REST
Representational State Transfer
• Estilo de arquitetura
• Dissertação de doutorado de Roy Fielding (capítulo 5)
• https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
(ah a ironia! como usar a Web do modo errado —^)
• O estilo REST não se aplica apenas a aplicações Web. Mas tem um “fit”
perfeito.
REST
Características
• Client / Server: força separação de responsabilidades
• Stateless: todo request é completo. Contém todas as informações
necessárias para ter a resposta certa (Sua aplicação Web sobrevive aqui?)
• Cacheable: as respostas devem oferecer (Bye Bye GraphQL!)
• Uniform Interface: garantido pelo combo HTTP + convenções
• Layered System: similar ao conceito de polimorfismo em OO
• Code on demand (opcional): código sendo entregue pra execução no cliente
(Ajax/JS? alguém?)
JSON
Um tipo de representação para um resource
• Serialização de objetos Javascript
• Content Type (MIME type: application/json)
• Pode ser gerada por um serializado de resources
Uma App Web “Raiz”
Porque SPAs são uma solução em busca de um problema
🔗 /todos?method=options
GET /todos
🔗 /todos/{id} DELETE /todos
JS/PATCH /todos/{id}
🔗 /profile
dica: JSON/PATCH
🔗 /todos
POST /todos
OPTIONS /todos
GET /todos/{id}
POST /todos/{id}?method=put|patch
🔗 /todos
e por último…
Precisamos de uma API
https://api.todos.com/ (?)
Porque separamos App e API?
E se?
> GET /todos
> Accept: application/json
<<<
[HEADERS]
{
"_context": {
"username": "username"
},
"offset": 0, "limit": 10,
"objects": [
{
"_href": "/todos/00001",
"id": 1,
"description": "limpar o quarto",
"checked": false
},
...
]
}
> OPTIONS /todos
> Accept: application/json
<<<
Allow: OPTIONS, GET, POST, PUT, PATCH
[MORE HEADERS]
{
"_context": {
"username": "text"
},
"_meta": {
"id": "number",
"description": "text",
"checked": "boolean"
}
}
➡Ou ainda um trecho da
especificação OpenAPI que
descreve o resource.
> GET /todos/00001
> Accept: application/json
<<<
[HEADERS]
{
"_context": {
"username": "text"
},
"object": {
"_href": "/todos/00001",
"id": 1,
"description": "limpar o quarto",
"checked": false
}
}
> PUT /todos/00001
> Content-Type: application/json
> Accept: application/json
>
> {
> "description": "limpar o quarto",
> "checked": false
> }
<<<
200 OK
Problemas & “Soluções”
Como fazer isso de modo “stateless”?
• Criar o conceito de “Embedded
Resource” com dados globais
(ex. usuário logado, timezone
configurado, idioma selecionado,
etc).
• Disponibilizar isso para o
renderizados do resource
embutir no resource
Dados de seção {
"_context": {
"username": "foo",
...
},
"object": {
"task": "limpar o quarto",
...
}
}
Navegadores suportam GET/POST
• A tag <form> suporta apenas
GET e POST como métodos
HTTP.
• Utilizar JS para extender o
funcionamento do navegador.
• Usar o header HTTP não-padrão
(X-HTTP-Method-Override) ou
uma query string que o servidor
entenda como
Suporte a verbos > GET /todos?method=head HTTP/1.1
> Host: todos.com
> User-Agent: …
> Accept: text/html
Queries e Embedded Resources
Resources muito leves ou muito pesados
• Uso de query string
• Tipo de problema resolvido pelo GraphQL caso não ele não violasse o estilo
REST
• restQL é uma alternativa padrão viável (desenvolvida no Brasil pela B2W):
• http://restql.b2w.io
Formulários Interativos / UX
• Use componentes JS para isso. A abordagem Web/API não invalida ou
impede o uso de componentes frontend
• Web Components nativos (suportados, pelo Polymer, Vue e React) são
complementos perfeitos pra essa abordagem
Isso já existe?
• Não existe em nenhum framework muito famoso mas não deve ser complicado implementar os conceitos
em seu framework favorito
• Necessário chamar o “renderizador” adequado de acordo com o Accept do request, lidar com as
sobrecargas de métodos HTTP para os navegadores e implementar um componente “Resource" para
representar os seus resources
• Existe um esboço no meu framework Toy (um framework de brinquedo)
• Aviso: use o Toy para estudar mas nunca em produção
• O seletor de render baseado em MIME type ainda não funciona 100%
• https://github.com/osantana/toy
• O projeto (abandonado) do Pactum arranhava essas ideias:
• https://github.com/olist/pactum
Application
Toy
Um framework de brinquedo
Router
Handler /
Controller
Handler /
Controller
Handler /
Controller
Content Type Renderers
HTML RenderJinja2 JSON Render import json
WSGI Resource
ResourceList
Fields
EmbeddedResourceField
Model / Persistence
SQLAlchemy

Weitere ähnliche Inhalte

Was ist angesagt? (20)

Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Php
PhpPhp
Php
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
An Introduction To REST API
An Introduction To REST APIAn Introduction To REST API
An Introduction To REST API
 
Testes pythonicos com pytest
Testes pythonicos com pytestTestes pythonicos com pytest
Testes pythonicos com pytest
 
Introduction to Django Rest Framework
Introduction to Django Rest FrameworkIntroduction to Django Rest Framework
Introduction to Django Rest Framework
 
React - Introdução
React - IntroduçãoReact - Introdução
React - Introdução
 
Introduction to back-end
Introduction to back-endIntroduction to back-end
Introduction to back-end
 
Introduction to ajax
Introduction  to  ajaxIntroduction  to  ajax
Introduction to ajax
 
Web engineering lecture 1
Web engineering lecture 1Web engineering lecture 1
Web engineering lecture 1
 
Burpsuite 101
Burpsuite 101Burpsuite 101
Burpsuite 101
 
Introduction to API
Introduction to APIIntroduction to API
Introduction to API
 
007 nms smi, oid, snmp method
007 nms smi, oid, snmp method007 nms smi, oid, snmp method
007 nms smi, oid, snmp method
 
UNIT-3 Servlet
UNIT-3 ServletUNIT-3 Servlet
UNIT-3 Servlet
 
SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python SQLAlchemy - Desenvolvendo uma aplicação com Python
SQLAlchemy - Desenvolvendo uma aplicação com Python
 
Vue.js
Vue.jsVue.js
Vue.js
 
Servlets
ServletsServlets
Servlets
 
Selenium WebDriver
Selenium WebDriverSelenium WebDriver
Selenium WebDriver
 
ASP.NET Core Unit Testing
ASP.NET Core Unit TestingASP.NET Core Unit Testing
ASP.NET Core Unit Testing
 

Ähnlich wie A Web é uma API

Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Helder da Rocha
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
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
 
Desenvolvemos para web?
Desenvolvemos para web?Desenvolvemos para web?
Desenvolvemos para web?Luis Vendrame
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a InternetLeonardo Soares
 
Linguagem PHP para principiantes
Linguagem PHP para principiantesLinguagem PHP para principiantes
Linguagem PHP para principiantesMarco Pinheiro
 
Sistemas Distribuídos baseados na Web
Sistemas Distribuídos baseados na WebSistemas Distribuídos baseados na Web
Sistemas Distribuídos baseados na WebRafael Chagas
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 
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
 
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
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPCarlos Santos
 
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Javaalexmacedo
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLGuilherme
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyantonio sérgio nogueira
 

Ähnlich wie A Web é uma API (20)

Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)Curso de WebServlets (Java EE 7)
Curso de WebServlets (Java EE 7)
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
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
 
Dawi o protocolo-http
Dawi o protocolo-httpDawi o protocolo-http
Dawi o protocolo-http
 
Design de RESTful APIs
Design de RESTful APIsDesign de RESTful APIs
Design de RESTful APIs
 
Desenvolvemos para web?
Desenvolvemos para web?Desenvolvemos para web?
Desenvolvemos para web?
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Introdução a programação para a Internet
Introdução a programação para a InternetIntrodução a programação para a Internet
Introdução a programação para a Internet
 
Rest workshop
Rest workshopRest workshop
Rest workshop
 
Linguagem PHP para principiantes
Linguagem PHP para principiantesLinguagem PHP para principiantes
Linguagem PHP para principiantes
 
Sistemas Distribuídos baseados na Web
Sistemas Distribuídos baseados na WebSistemas Distribuídos baseados na Web
Sistemas Distribuídos baseados na Web
 
Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 
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
 
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
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
 
WebService Restful em Java
WebService Restful em JavaWebService Restful em Java
WebService Restful em Java
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTML
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
 

Mehr von Osvaldo Santana Neto

Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonOsvaldo Santana Neto
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Osvaldo Santana Neto
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Osvaldo Santana Neto
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remotoOsvaldo Santana Neto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaOsvaldo Santana Neto
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Osvaldo Santana Neto
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e DjangoOsvaldo Santana Neto
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Osvaldo Santana Neto
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaOsvaldo Santana Neto
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Osvaldo Santana Neto
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Osvaldo Santana Neto
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasOsvaldo Santana Neto
 

Mehr von Osvaldo Santana Neto (20)

Basic Brainf*ck
Basic Brainf*ckBasic Brainf*ck
Basic Brainf*ck
 
Contruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com PythonContruindo um Framework Web de Brinquedo só com Python
Contruindo um Framework Web de Brinquedo só com Python
 
Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)Dave Thomas - Agile is Dead (GOTO 2015)
Dave Thomas - Agile is Dead (GOTO 2015)
 
Olist Architecture v2.0
Olist Architecture v2.0Olist Architecture v2.0
Olist Architecture v2.0
 
Advanced Brainf*ck
Advanced Brainf*ckAdvanced Brainf*ck
Advanced Brainf*ck
 
Corrigindo Bugs no CPython
Corrigindo Bugs no CPythonCorrigindo Bugs no CPython
Corrigindo Bugs no CPython
 
Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018Como funciona um time remoto de desenvolvimento - Caipyra 2018
Como funciona um time remoto de desenvolvimento - Caipyra 2018
 
Escalando times através do trabalho remoto
Escalando times através do trabalho remotoEscalando times através do trabalho remoto
Escalando times através do trabalho remoto
 
Plataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funcionaPlataforma distribuída de Microserviços ou, como a Olist funciona
Plataforma distribuída de Microserviços ou, como a Olist funciona
 
Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20Real Life Hackers @ PechaKucha 20x20
Real Life Hackers @ PechaKucha 20x20
 
De Zero à Web com Python e Django
De Zero à Web com Python e DjangoDe Zero à Web com Python e Django
De Zero à Web com Python e Django
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Curso de Python e Django
Curso de Python e DjangoCurso de Python e Django
Curso de Python e Django
 
Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)Entendiendo Unicode (Facundo Batista)
Entendiendo Unicode (Facundo Batista)
 
Como me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonistaComo me tornei um empreendedor pythonista
Como me tornei um empreendedor pythonista
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)
 
Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)Ludeos - Venda seu conteúdo online (how it works)
Ludeos - Venda seu conteúdo online (how it works)
 
App Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horasApp Engine: aplicações escaláveis em poucas horas
App Engine: aplicações escaláveis em poucas horas
 
Programação RAD com Python
Programação RAD com PythonProgramação RAD com Python
Programação RAD com Python
 

A Web é uma API

  • 1. A Web é uma API Osvaldo Santana Neto ... REST
  • 2. Disclaimer para os mais experientes Eu vou reapresentar o básico porque no básico encontraremos os fundamentos.
  • 4. No princípio era a Web Berners-Lee* 1:1 * Inventor da Web
  • 5. World Wide Web O que é? • Resource (Recursos/Conteúdo/Documento) • Representação (MIME Types: text/html, application/json) • Endereçamento (Uniform Resource Locator) • Protocolo (HTTP) • Arquitetura Cliente/Servidores (browser & HTTP Server) • Stateless
  • 6. World Wide Web “A Web é um conjunto de recursos, que podem ser acessados por um cliente, localizados em algum local apontado por uma URL (Unified Resource Locator). Uma representação desses recursos serão servidos através do protocolo HTTP.”
  • 7. Resources, URLs e Representação • Resource vs Representação: documentos, streams, imagens, áudio, vídeo, etc • Possuem um tipo associado (Content-Type) definido com um MIME type • O mesmo resource pode ser representado com tipos diferentes • Apontados por um localizador (URL) • http://example.com/index.html • Uma URL sempre aponta para um único resource. Uma lista de resources é um resource do tipo lista de resources. Múltiplas URLs podem apontar para o mesmo resource (uso de canonical URLs)
  • 8. “Lembre-se: Resources e Models são conceitos diferentes”
  • 9. HTTP, Clientes e Servidores • Protocolo HTTP • Protocolo de comunicação Cliente/Servidor que opera na camada de Aplicação • A primeira versão do HTTP é baseada em texto. As versões seguintes podem funcionar com dados binários • Existe uma extensão que adiciona suporte a criptografia que é chamada HTTPS • Clientes • Existem vários tipos de clientes (User Agents). O mais conhecido é o navegador (browser) • Os clientes usam HTTP para fazer requisições para um endereço onde tem um servidor Web • Servidores • O servidor Web recebe requisições feitas por clientes e devolvem os recursos solicitados usando também o protocolo HTTP • Por padrão, em redes TCP/IP, o servidor recebe as requisições através das portas 80 (http) ou 442 (https)
  • 10. Request Um cliente faz uma requisição para o servidor... • O request especifica uma ação com um verbo. Existe um conjunto padronizado de verbos tais como: GET, POST, PUT, DELETE, PATCH, etc • O request especifica a URL do recurso desejado • O request pode incluir outros detalhes sobre o tipo de resource ou como ele prefere receber esse resource • Usamos cabeçalhos do protocolo para esse propósito (ex. Accept) • Você pode especificar qual a representação (MIME type) você quer ter do recurso (Accept). Exemplo: text/html, application/json • Content-Type especifica o formato da requisição. Accept especifica o formato que você prefere a resposta. Você pode informar uma lista qualificada de MIME types
  • 11. > GET /todos HTTP/1.1 > Host: todos.com > User-Agent: … > Accept: text/html > GET /todos HTTP/1.1 > Host: todos.com > User-Agent: … > Accept: application/json > GET /todos HTTP/1.1 > Host: todos.com > User-Agent: … > Accept: text/html; q=0.2, application/json Exemplos • Todos os exemplos ao lado solicitam um único resource com a lista de todas as tarefas (TODO list) • O terceiro exemplo requisita preferencialmente o resource com representação application/json mas aceita text/html se for uma alternativa viável para o servidor • Você tem que lidar com respostas 300 Multiple Choices e 406 Not Acceptable Request
  • 12. Response ... que devolve uma resposta para o cliente • A resposta inicia com um código de status • https://github.com/osantana/staty • A resposta também inclui cabeçalhos HTTP com metadados da resposta (ex. tipo de representação do conteúdo) • Na sequência, dependendo do status code, recebemos o conteúdo do resource representado com um dos formatos solicitados na requisição.
  • 13. < HTTP/1.1 200 OK < Cache-Control: [cache info] < Content-Type: text/html < Etag: [tag] < Expires: [data] < Last-Modified: [data] < < [HTML] < HTTP/1.1 200 OK < Cache-Control: [cache info] < Content-Type: application/json < Etag: [tag] < Expires: [data] < Last-Modified: [data] < < [JSON] Exemplos • Todos os exemplos ao lado solicitam um único resource com a lista de todas as tarefas (TODO list) • O terceiro exemplo requisita preferencialmente o resource com representação application/json mas aceita text/html se for uma alternativa viável para o servidor • Você tem que lidar com respostas 300 Multiple Choices e 406 Not Acceptable Response
  • 14. HTML Um tipo de representação para um resource • Documentos Hipertexto • Conceito já explorado na literatura desde a década de 40 • Marcações (tags) especificam a semântica do conteúdo • Content Type (MIME type: text/html) • Linguagem de marcação subset do SGML • Suporte a hiperlinks • Clientes do tipo Web Browser sabem renderizar esses documentos • Usam CSS e JS para especificar visual e comportamento • Pode ser gerado por um renderizados de linguagem de template.
  • 16. HTTP HTTP como transporte • RPC • XMLRPC • SOAP • gRPC • CORBA • 🙄 • Vamos pular isso aqui...
  • 17. REST e a Web somos um Roy Fielding* 10:30 * Um dos criadores da especificação HTTP e co-fundador da Apache
  • 18. REST Representational State Transfer • Estilo de arquitetura • Dissertação de doutorado de Roy Fielding (capítulo 5) • https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm https://www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf (ah a ironia! como usar a Web do modo errado —^) • O estilo REST não se aplica apenas a aplicações Web. Mas tem um “fit” perfeito.
  • 19. REST Características • Client / Server: força separação de responsabilidades • Stateless: todo request é completo. Contém todas as informações necessárias para ter a resposta certa (Sua aplicação Web sobrevive aqui?) • Cacheable: as respostas devem oferecer (Bye Bye GraphQL!) • Uniform Interface: garantido pelo combo HTTP + convenções • Layered System: similar ao conceito de polimorfismo em OO • Code on demand (opcional): código sendo entregue pra execução no cliente (Ajax/JS? alguém?)
  • 20. JSON Um tipo de representação para um resource • Serialização de objetos Javascript • Content Type (MIME type: application/json) • Pode ser gerada por um serializado de resources
  • 21. Uma App Web “Raiz” Porque SPAs são uma solução em busca de um problema
  • 22. 🔗 /todos?method=options GET /todos 🔗 /todos/{id} DELETE /todos JS/PATCH /todos/{id} 🔗 /profile dica: JSON/PATCH
  • 26.
  • 27. Precisamos de uma API https://api.todos.com/ (?)
  • 29. E se?
  • 30. > GET /todos > Accept: application/json <<< [HEADERS] { "_context": { "username": "username" }, "offset": 0, "limit": 10, "objects": [ { "_href": "/todos/00001", "id": 1, "description": "limpar o quarto", "checked": false }, ... ] }
  • 31. > OPTIONS /todos > Accept: application/json <<< Allow: OPTIONS, GET, POST, PUT, PATCH [MORE HEADERS] { "_context": { "username": "text" }, "_meta": { "id": "number", "description": "text", "checked": "boolean" } } ➡Ou ainda um trecho da especificação OpenAPI que descreve o resource.
  • 32. > GET /todos/00001 > Accept: application/json <<< [HEADERS] { "_context": { "username": "text" }, "object": { "_href": "/todos/00001", "id": 1, "description": "limpar o quarto", "checked": false } }
  • 33. > PUT /todos/00001 > Content-Type: application/json > Accept: application/json > > { > "description": "limpar o quarto", > "checked": false > } <<< 200 OK
  • 35. Como fazer isso de modo “stateless”? • Criar o conceito de “Embedded Resource” com dados globais (ex. usuário logado, timezone configurado, idioma selecionado, etc). • Disponibilizar isso para o renderizados do resource embutir no resource Dados de seção { "_context": { "username": "foo", ... }, "object": { "task": "limpar o quarto", ... } }
  • 36. Navegadores suportam GET/POST • A tag <form> suporta apenas GET e POST como métodos HTTP. • Utilizar JS para extender o funcionamento do navegador. • Usar o header HTTP não-padrão (X-HTTP-Method-Override) ou uma query string que o servidor entenda como Suporte a verbos > GET /todos?method=head HTTP/1.1 > Host: todos.com > User-Agent: … > Accept: text/html
  • 37. Queries e Embedded Resources Resources muito leves ou muito pesados • Uso de query string • Tipo de problema resolvido pelo GraphQL caso não ele não violasse o estilo REST • restQL é uma alternativa padrão viável (desenvolvida no Brasil pela B2W): • http://restql.b2w.io
  • 38. Formulários Interativos / UX • Use componentes JS para isso. A abordagem Web/API não invalida ou impede o uso de componentes frontend • Web Components nativos (suportados, pelo Polymer, Vue e React) são complementos perfeitos pra essa abordagem
  • 39. Isso já existe? • Não existe em nenhum framework muito famoso mas não deve ser complicado implementar os conceitos em seu framework favorito • Necessário chamar o “renderizador” adequado de acordo com o Accept do request, lidar com as sobrecargas de métodos HTTP para os navegadores e implementar um componente “Resource" para representar os seus resources • Existe um esboço no meu framework Toy (um framework de brinquedo) • Aviso: use o Toy para estudar mas nunca em produção • O seletor de render baseado em MIME type ainda não funciona 100% • https://github.com/osantana/toy • O projeto (abandonado) do Pactum arranhava essas ideias: • https://github.com/olist/pactum
  • 40. Application Toy Um framework de brinquedo Router Handler / Controller Handler / Controller Handler / Controller Content Type Renderers HTML RenderJinja2 JSON Render import json WSGI Resource ResourceList Fields EmbeddedResourceField Model / Persistence SQLAlchemy