HTTP API & Python

5f27d0b43fc28785db65c57ae7e81ec5?s=47 Milan Cermak
February 20, 2013

HTTP API & Python

Slides from my talk at Brno and Prague Python user group meetups on HTTP/REST APIs.

5f27d0b43fc28785db65c57ae7e81ec5?s=128

Milan Cermak

February 20, 2013
Tweet

Transcript

  1. HTTP API & Py Milan Čermák Pyvo Praha, 20. 2.

    2013 Wednesday, February 20, 13
  2. What makes a good API? Wednesday, February 20, 13

  3. Wednesday, February 20, 13

  4. Consistency Wednesday, February 20, 13

  5. Consistency Predictability Wednesday, February 20, 13

  6. Consistency Predictability Adherence to standards Wednesday, February 20, 13

  7. Consistency Predictability Adherence to standards Great documentation Wednesday, February 20,

    13
  8. Why HTTP? Wednesday, February 20, 13

  9. "While HTTP isn’t always the best answer, it’s a damn

    fine first guess." Coda Hale Wednesday, February 20, 13
  10. Benefits of HTTP Wednesday, February 20, 13

  11. Benefits of HTTP The most widespread application protocol Wednesday, February

    20, 13
  12. Benefits of HTTP The most widespread application protocol Statelessness Wednesday,

    February 20, 13
  13. Benefits of HTTP The most widespread application protocol Statelessness Optional

    caching Wednesday, February 20, 13
  14. Benefits of HTTP The most widespread application protocol Statelessness Optional

    caching Promotes layered infrastructure Wednesday, February 20, 13
  15. Benefits of HTTP The most widespread application protocol Statelessness Optional

    caching Promotes layered infrastructure etc. Wednesday, February 20, 13
  16. Limitations of HTTP Wednesday, February 20, 13

  17. Limitations of HTTP Authorization Wednesday, February 20, 13

  18. Limitations of HTTP Authorization Statelessness Wednesday, February 20, 13

  19. Limitations of HTTP Authorization Statelessness Verbosity Wednesday, February 20, 13

  20. Limitations of HTTP Authorization Statelessness Verbosity Crippled parallelism Wednesday, February

    20, 13
  21. "REST" if protocol.startswith("http") else "you're doing it wrong" Wednesday, February

    20, 13
  22. Set of architectural constraints Wednesday, February 20, 13

  23. Set of architectural constraints Client-server Wednesday, February 20, 13

  24. Set of architectural constraints Client-server Stateless Wednesday, February 20, 13

  25. Set of architectural constraints Client-server Stateless Cacheable Wednesday, February 20,

    13
  26. Set of architectural constraints Client-server Stateless Cacheable Layered Wednesday, February

    20, 13
  27. Set of architectural constraints Client-server Stateless Cacheable Layered Uniform interface

    * Wednesday, February 20, 13
  28. How can Python help? Wednesday, February 20, 13

  29. OOP Wednesday, February 20, 13

  30. OOP URI ~ Class handler mapping Wednesday, February 20, 13

  31. import handlers urls = [(r"/user", handlers.users.NewUser), (r"/user/(\d+)", handlers.users.User)] class User(handler.base.BaseHandler):

    def delete(self, user_id): pass def get(self, user_id): pass def post(self, user_id): pass Wednesday, February 20, 13
  32. class UserValidatorMixin(object): def check_user_data(self, user_dict): pass class User(handler.base.BaseHandler, UserValidatorMixin): def

    post(self, user_id): new_user = self.get_argument(“user”) if not self.check_user_data(new_user): return self.http_error(400, “Invalid data”) Wednesday, February 20, 13
  33. Middleware Wednesday, February 20, 13

  34. Wednesday, February 20, 13

  35. Extending JSONEncoder Wednesday, February 20, 13

  36. import json class AppJSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, User):

    return {"name": obj.name, "height": obj.height, "cash": obj.get_bank_account_balance()} return json.JSONEncoder.default(self, obj) user = User("1337") json.dumps(user, cls=AppJSONEncoder) Wednesday, February 20, 13
  37. What about mobile? Wednesday, February 20, 13

  38. Compression of HTTP bodies GET /user/1337 HTTP/1.1 Host: api.napyvo.io Accept-Encoding:

    gzip, identity Wednesday, February 20, 13
  39. Compression of HTTP bodies HTTP/1.1 200 OK Content-Encoding: gzip Content-Type:

    application/json; charset=utf-8 Wednesday, February 20, 13
  40. Compression of HTTP bodies POST /user HTTP/1.1 Host: api.napyvo.io Content-Encoding:

    gzip Content-Type: application/json [gzipped representation of a user] Wednesday, February 20, 13
  41. Caching Cache-Control: max-age=3600 Expires: Thu, 31 Jan 2013 22:00:00 GMT

    <- Last-Modified: Thu, 31 Jan 2013 18:30:00 GMT -> If-Modified-Since: Wed, 30 Jan 2013 13:37:00 GMT ETag: foo If-None-Match: foo Wednesday, February 20, 13
  42. Partial resources Wednesday, February 20, 13

  43. GET /car/9 {"car": { "color": "red", "passengers": [ {"href": "/user/1337",

    "rel": "self"}] } } Wednesday, February 20, 13
  44. GET /car/9?zoom=passengers {"car": { "color": "red", "passengers": [ {"href": "/user/1337",

    "rel": "self", "name": "Milan", "drink": "beer", "skills": ["python", "http"], }] } } Wednesday, February 20, 13
  45. The promise of Hypermedia Wednesday, February 20, 13

  46. Hypermedia as the engine of application state Wednesday, February 20,

    13
  47. Q & A Wednesday, February 20, 13