Date post: | 12-Apr-2017 |
Category: |
Technology |
Upload: | diogo-gomes |
View: | 130 times |
Download: | 0 times |
REST 101REST Work Shop – 8 Março 2017
http://tutorials.jenkov.com/web-services/message-formats.html
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.1Accept:*/* Accept-Language: en-gbAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSI 6.0)Host: www.ua.ptConnection: Keep-Alive
HTTP Method URL relativo ou URL absoluto
HTTP Version
Cabeçalho
HTTP Response
HTTP/1.1 200 OKServer: Microsoft-IIS/7.5Set-Cookie: ASP.NET_SessionId=5xf5yjpvgjhxdkzghywlabmu; path=/; HttpOnlyContent-Type: text/html; charset=utf-8X-AspNet-Version: 4.0.30319X-Powered-By: ASP.NETConnection: closeDate: Sat, 22 Mar 2014 22:10:03 GMTContent-Length: 29298Cache-Control: privateX-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
DOMFrameworks populares: Angular, React
Servidor serve conteúdos criados em função dos pedidos do clienteFrameworks 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 DELETEhttp://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 cherrypyclass 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 [email protected] 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 jsonimport cherrypy
@cherrypy.exposeclass 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/XMLclass 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/