Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Rest workshop

242 Aufrufe

Veröffentlicht am

Introdução ao REST usando CherryPy (Python)

Veröffentlicht in: Technologie
  • Login to see the comments

Rest workshop

  1. 1. REST 101 REST Work Shop – 8 Março 2017 http://tutorials.jenkov.com/web-services/message-formats.h
  2. 2. 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
  3. 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. 4. 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
  5. 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. 6. 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
  7. 7. Resumindo…
  8. 8. 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)
  9. 9. 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)
  10. 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. 11. 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
  12. 12. 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())
  13. 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. 14. 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)
  15. 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. 16. 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)
  17. 17. 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'}
  18. 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. 19. Referências  https://www.ietf.org/rfc/rfc2616.txt  http://docs.cherrypy.org/en/latest/  http://docs.python- requests.org/en/master/

×