REST 101
REST Work Shop – 8 Março 2017
http://tutorials.jenkov.com/web-services/message-formats.h
Protocolo HTTP
 Protocolo Cliente-
Servidor
 Suportado em TCP
 Popularizado em 1990
por Tim Berners-Lee
 Criação da World Wide
Web
 Protocolo baseado em
Texto
HTTP Request
GET /
HTTP/1.1
Accept:*/*
Accept-Language: en-gb
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSI
6.0)
Host: www.ua.pt
Connection: Keep-Alive
HTTP Method
URL relativo ou URL
absoluto
HTTP
Version
Cabeçalho
HTTP Response
HTTP/1.1 200 OK
Server: Microsoft-IIS/7.5
Set-Cookie: ASP.NET_SessionId=5xf5yjpvgjhxdkzghywlabmu; path=/; HttpOnly
Content-Type: text/html; charset=utf-8
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Connection: close
Date: Sat, 22 Mar 2014 22:10:03 GMT
Content-Length: 29298
Cache-Control: private
X-WUA-SERVER: WUA-I2
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta http-
equiv="Content-Type" content="text/html; charset=UTF-8" /><title>
Universidade de Aveiro › Página inicial
</title><script type="text/javascript" src="http://static.web.ua.pt/js/jquery/jquery-
1.10.2.min.js"></script><script type="text/javascript"
src="http://static.web.ua.pt/js/uacookies/1/cookies.pt.min.js"></script><link href="images/ua.ico"
rel="shortcut icon" /><link href="/css/menus.min.css" type="text/css" rel="Stylesheet" /><link
href="/css/stylesheet.min.css" type="text/css" rel="Stylesheet" /><link id="ctl00_dinstyle"
href="/css/dinStyle.aspx?css=dinStyle.css%26svr=uasite" type="text/css" rel="Stylesheet" />
Status
line
Cabeçalho
Duplo CRLF
(carriage return, line feed)
Conteúdos
pedidos
Principais métodos HTTP
 GET permite aceder a qualquer
informação identificada pelo Request-
URI
 POST utilizado para enviar
informação para o servidor
Códigos de Status e Erro
 1xx – Informacional – resposta intermédia que indica que o servidor
ainda não acabou de processar o pedido
 2xx – Bem sucedido
 200 OK
 3xx – Redireccionamento do cliente para outra localização
 301-permanent, 302-temporary
 4xx – Erro provocado pelo Cliente
 400-bad request, 403-forbidden, 404-not found
 5xx – Erro do Servidor
 500 Internal Server Error, 503-Service Unavailable,504-Gateway
Timeout
Resumindo…
Web App/Service
 A criação de sites dinâmicos que se
adaptam ao cliente podem ser
alcançados:
Manipulação local usando JS do DOM
Frameworks populares: Angular, React
Servidor serve conteúdos criados em
função dos pedidos do cliente
Frameworks populares: Django, ASP, Play
(Java)
Aplicação Web
 O servidor recebe os dados vindos do
cliente e processa os mesmos.
 Pode gerar:
Página Web com conteúdos
personalizados
Documento JSON
Que pode ser processado no Web Browser
Documento XML
Que pode ser processado por outra aplicação
(caso normal de um Web Service)
O QUE É ISSO DE REST ?
 Representational state transfer (REST) ou RESTful Web services
 Alternativa a WSDL ou SOAP
 Tem por base o protocolo HTTP e a sua semantica (GET, POST, DELETE, PUT)
 Propriedades Arquitecturais:
 Interface Uniforme
 através de URI que identifica univocamente o recurso
 Stateless
 servidor não guarda informação de estado, todas informação necessária à operação é enviada ao cliente
 Cacheable
 Uma que vez que é stateless, a informação pode facilmente ser cached
 Layered System
 Como é stateless e cacheable é possivel escalar a solução através de camadas que incluem proxys e load-
balancers
 REST não é um standard, mas faz uso de standards (HTTP, JSON, XML)
 Daí muitas coisas poderem ser chamadas de REST e não haver uma definição inequivoca.
Exemplos:
URL GET PUT POST DELETE
http://api.deti.
ua.pt/cursos
LISTAR
recursos
SUBSTITUIR
toda a
colecção
CRIAR uma
nova entrada
APAGAR a
colecção
http://api.deti.
ua.pt/cursos/
miect
CONSULTAR
recurso
SUBSTITUIR/
CRIAR o
recurso
SUBSTITUIR/
CRIAR o
recurso
APAGAR o
recurso
CherryPy
 Framework Web Minimalista (Python)
 Permite um desenvolvimento isolado
 Sem recorrer a um servidor Web comum (Apache,
NGINX)
 “Tão simples como:”import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
Not so simple… 
 Criar um VirtualEnv e instalar o cherrypy:
$ virtualenv venv
$ source venv/bin/activate
$ pip install cherrypy
 Executar e testar:
$ python test.py
Abrir o browser/ARC
e colocar endereço:
http://localhost:8080
Mais do que uma função…
 Acrescente ao index(self):
print(cherrypy.request.headers)
print(cherrypy.request.method)
 E argumentos ?
@cherrypy.expose
def receptor(self, numero):
return str(int(numero)*2)
http://localhost:8080/miect/disciplinas
/labi/
import cherrypy
@cherrypy.popargs(‘curso’)
class Curso(object):
def __init__(self):
self.disciplinas = Disciplina()
@cherrypy.expose
def index(self, curso):
return “Sobre o curso de {}”.format(curso)
@cherrypy.popargs(‘disciplina’)
class Disciplina(object):
@cherrypy.expose
def index(self, curso, disciplina):
return “{} do curso de {}”.format(disciplina,
curso)
cherrypy.quickstart(Curso())
Então e os verbos HTTP ?
import json
import cherrypy
@cherrypy.expose
class StringGeneratorWebService(object):
def __init__(self):
self.curso = []
@cherrypy.tools.accept(media='text/json')
def GET(self):
return json.dumps(self.curso)
def POST(self, cursos):
self.curso = json.loads(cursos)
def PUT(self, curso):
self.curso.append(curso)
def DELETE(self):
self.curso = []
if __name__ == '__main__':
conf = {
'/': {
'request.dispatch': cherrypy.dispatch.MethodDispatcher(),
'tools.response_headers.on': True,
'tools.response_headers.headers': [('Content-Type', 'text/plain')],
}
}
cherrypy.quickstart(StringGeneratorWebService(), '/', conf)
E como envio coisas ”a sério” ?
 Codificar em JSON/XML
class Root(object):
@cherrypy.expose
@cherrypy.tools.json_in()
def index(self):
data = cherrypy.request.json
class Root(object):
@cherrypy.expose
@cherrypy.tools.json_out()
def index(self):
return {'key': 'value'}
Então e como é que o meu
programa faz pedidos ?
 Requests: HTTP for Humans¶
Import requests
r = requests.put('http://localhost:8080/', data = {'key':'value'})
r = requests.delete('http://localhost:8080/')
r = requests.head('http://localhost:8080/')
r = requests.options('http://localhost:8080/')
r = requests.post('http://localhost:8080/', data=json.dumps(payload))
print(r.text)
Referências
 https://www.ietf.org/rfc/rfc2616.txt
 http://docs.cherrypy.org/en/latest/
 http://docs.python-
requests.org/en/master/

Rest workshop

  • 1.
    REST 101 REST WorkShop – 8 Março 2017 http://tutorials.jenkov.com/web-services/message-formats.h
  • 2.
    Protocolo HTTP  ProtocoloCliente- Servidor  Suportado em TCP  Popularizado em 1990 por Tim Berners-Lee  Criação da World Wide Web  Protocolo baseado em Texto
  • 3.
    HTTP Request GET / HTTP/1.1 Accept:*/* Accept-Language:en-gb Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSI 6.0) Host: www.ua.pt Connection: Keep-Alive HTTP Method URL relativo ou URL absoluto HTTP Version Cabeçalho
  • 4.
    HTTP Response HTTP/1.1 200OK Server: Microsoft-IIS/7.5 Set-Cookie: ASP.NET_SessionId=5xf5yjpvgjhxdkzghywlabmu; path=/; HttpOnly Content-Type: text/html; charset=utf-8 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Connection: close Date: Sat, 22 Mar 2014 22:10:03 GMT Content-Length: 29298 Cache-Control: private X-WUA-SERVER: WUA-I2 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><meta http- equiv="Content-Type" content="text/html; charset=UTF-8" /><title> Universidade de Aveiro › Página inicial </title><script type="text/javascript" src="http://static.web.ua.pt/js/jquery/jquery- 1.10.2.min.js"></script><script type="text/javascript" src="http://static.web.ua.pt/js/uacookies/1/cookies.pt.min.js"></script><link href="images/ua.ico" rel="shortcut icon" /><link href="/css/menus.min.css" type="text/css" rel="Stylesheet" /><link href="/css/stylesheet.min.css" type="text/css" rel="Stylesheet" /><link id="ctl00_dinstyle" href="/css/dinStyle.aspx?css=dinStyle.css%26svr=uasite" type="text/css" rel="Stylesheet" /> Status line Cabeçalho Duplo CRLF (carriage return, line feed) Conteúdos pedidos
  • 5.
    Principais métodos HTTP GET permite aceder a qualquer informação identificada pelo Request- URI  POST utilizado para enviar informação para o servidor
  • 6.
    Códigos de Statuse Erro  1xx – Informacional – resposta intermédia que indica que o servidor ainda não acabou de processar o pedido  2xx – Bem sucedido  200 OK  3xx – Redireccionamento do cliente para outra localização  301-permanent, 302-temporary  4xx – Erro provocado pelo Cliente  400-bad request, 403-forbidden, 404-not found  5xx – Erro do Servidor  500 Internal Server Error, 503-Service Unavailable,504-Gateway Timeout
  • 7.
  • 8.
    Web App/Service  Acriação de sites dinâmicos que se adaptam ao cliente podem ser alcançados: Manipulação local usando JS do DOM Frameworks populares: Angular, React Servidor serve conteúdos criados em função dos pedidos do cliente Frameworks populares: Django, ASP, Play (Java)
  • 9.
    Aplicação Web  Oservidor recebe os dados vindos do cliente e processa os mesmos.  Pode gerar: Página Web com conteúdos personalizados Documento JSON Que pode ser processado no Web Browser Documento XML Que pode ser processado por outra aplicação (caso normal de um Web Service)
  • 10.
    O QUE ÉISSO DE REST ?  Representational state transfer (REST) ou RESTful Web services  Alternativa a WSDL ou SOAP  Tem por base o protocolo HTTP e a sua semantica (GET, POST, DELETE, PUT)  Propriedades Arquitecturais:  Interface Uniforme  através de URI que identifica univocamente o recurso  Stateless  servidor não guarda informação de estado, todas informação necessária à operação é enviada ao cliente  Cacheable  Uma que vez que é stateless, a informação pode facilmente ser cached  Layered System  Como é stateless e cacheable é possivel escalar a solução através de camadas que incluem proxys e load- balancers  REST não é um standard, mas faz uso de standards (HTTP, JSON, XML)  Daí muitas coisas poderem ser chamadas de REST e não haver uma definição inequivoca.
  • 11.
    Exemplos: URL GET PUTPOST DELETE http://api.deti. ua.pt/cursos LISTAR recursos SUBSTITUIR toda a colecção CRIAR uma nova entrada APAGAR a colecção http://api.deti. ua.pt/cursos/ miect CONSULTAR recurso SUBSTITUIR/ CRIAR o recurso SUBSTITUIR/ CRIAR o recurso APAGAR o recurso
  • 12.
    CherryPy  Framework WebMinimalista (Python)  Permite um desenvolvimento isolado  Sem recorrer a um servidor Web comum (Apache, NGINX)  “Tão simples como:”import cherrypy class HelloWorld(object): @cherrypy.expose def index(self): return "Hello World!" cherrypy.quickstart(HelloWorld())
  • 13.
    Not so simple…  Criar um VirtualEnv e instalar o cherrypy: $ virtualenv venv $ source venv/bin/activate $ pip install cherrypy  Executar e testar: $ python test.py Abrir o browser/ARC e colocar endereço: http://localhost:8080
  • 14.
    Mais do queuma função…  Acrescente ao index(self): print(cherrypy.request.headers) print(cherrypy.request.method)  E argumentos ? @cherrypy.expose def receptor(self, numero): return str(int(numero)*2)
  • 15.
    http://localhost:8080/miect/disciplinas /labi/ import cherrypy @cherrypy.popargs(‘curso’) class Curso(object): def__init__(self): self.disciplinas = Disciplina() @cherrypy.expose def index(self, curso): return “Sobre o curso de {}”.format(curso) @cherrypy.popargs(‘disciplina’) class Disciplina(object): @cherrypy.expose def index(self, curso, disciplina): return “{} do curso de {}”.format(disciplina, curso) cherrypy.quickstart(Curso())
  • 16.
    Então e osverbos HTTP ? import json import cherrypy @cherrypy.expose class StringGeneratorWebService(object): def __init__(self): self.curso = [] @cherrypy.tools.accept(media='text/json') def GET(self): return json.dumps(self.curso) def POST(self, cursos): self.curso = json.loads(cursos) def PUT(self, curso): self.curso.append(curso) def DELETE(self): self.curso = [] if __name__ == '__main__': conf = { '/': { 'request.dispatch': cherrypy.dispatch.MethodDispatcher(), 'tools.response_headers.on': True, 'tools.response_headers.headers': [('Content-Type', 'text/plain')], } } cherrypy.quickstart(StringGeneratorWebService(), '/', conf)
  • 17.
    E como enviocoisas ”a sério” ?  Codificar em JSON/XML class Root(object): @cherrypy.expose @cherrypy.tools.json_in() def index(self): data = cherrypy.request.json class Root(object): @cherrypy.expose @cherrypy.tools.json_out() def index(self): return {'key': 'value'}
  • 18.
    Então e comoé que o meu programa faz pedidos ?  Requests: HTTP for Humans¶ Import requests r = requests.put('http://localhost:8080/', data = {'key':'value'}) r = requests.delete('http://localhost:8080/') r = requests.head('http://localhost:8080/') r = requests.options('http://localhost:8080/') r = requests.post('http://localhost:8080/', data=json.dumps(payload)) print(r.text)
  • 19.