APIs e Microsserviços

30 jan, 2013

Exposição simples de APIs Python via REST-ful – Parte 01

Publicidade

Depois de ter escrito código para expor APIs através de serviços web RESTful algumas vezes, eu decidi fazê-lo mais uma vez, só que desta eu não vou ser pago, nem terei prazos. Vou escrevê-lo e nunca mais terei que escrever de novo, e vou torná-lo disponível como open source.

O problema é que eu sou uma pessoa muito preguiçosa e não fui capaz de criar coragem para realmente começar a escrever, o que me leva a este artigo.

Para que outra pessoa seja capaz de acompanhar o trabalho, obviamente não tenho que explicitar que o objetivo deste exercício é:

  • Criar uma ferramenta que pode expor uma API Python de uma forma REST
  • A API em si não deve ter que saber sobre a ferramenta
  • Deve ser executado em pelo menos em CherryPy e em dois outros frameworks webapp TBD (não, não o Django)
  • É preciso lidar com erros HTTP
  • Deve ser capaz de codar dados em JSON antes de retorná-los
  • Deve ser executada em Python 3.2+
  • Não deve se importar com a definição adequada de RESTful

Além disso, algumas coisas boas para se ter:

  • Pode fazer ligações entre os recursos de forma mais fácil (se possível)
  • Pode ser capaz de usar outros formatos de dados além do JSON
  • Pode ser executado em Python 2.7

Por gostar de trabalhar com CherryPy, vou começar a escrever para CherryPy e depois generalizar a partir de lá. Só para começar, eu criei um aplicativo mínimo em CherryPy a partir do qual trabalhar, mesmo que eu vá dividir a ferramenta do framework (ou o framework REST do framework web?) mais tarde. O código inteiro é assim:

import cherrypy
def requesthandler(*pathargs, **kwargs):
    cherrypy.response.status = "500 Server Error"
    return "Not implemented"
class PyRest(object):
    def index(self, *args, **kwargs):
        return requesthandler(*args, **kwargs)
    index.exposed = True
CONF = {
    'global': {
        'server.socket_host': '0.0.0.0',
        'server.socket_port': 8888,
    }
}
if __name__ == '__main__':
    ROOT = PyRest()
    cherrypy.quickstart(ROOT, '/', CONF)
def application(environ, start_response):
  cherrypy.tree.mount(PyRest(), '/', None)
  return cherrypy.tree(environ, start_response)

 

***

Texto original disponível em http://blaag.haard.se/Simple-REST-ful—ish–exposure-of-Python-APIs/