Upgrade to Pro — share decks privately, control downloads, hide ads and more …

What's wrong with API wrappers

What's wrong with API wrappers

Wrappers are an essential tool for interacting with web APIs. They reduce the amount of work needed to make requests and sometimes, only sometimes prevent the developer from dealing with extensive documentations. It’s common to encounter libs that require not only the study of their own documentation, but also the APIs one, duplicating the needed work. This is caused because wrappers do not follow a design pattern, each developer creates it’s own design, coding style and use their preferred tools.

Tapioca is what can be called: “a wrapper generator”. Creating API wrappers with Tapioca is extremely easy and fast. For example, it took 1 hour to write the full wrapper for the Parse.com REST API. But this is not the more important thing, Tapioca libs have a similar interface so once understood how they work, developers can work with any other without the need to learn a new interface.

Tapioca is also thought to comply with REST features and takes HATEOAS (Hypermedia as the engine of application state) seriously, so “following” links and pagination are natively supported. Explorability is also a key concept and developers are encouraged to play with Tapioca packages and find their way through APIs before writing their final code. Although there are some production ready Tapioca wrappers, it is a work in progress, there are still many features to be explored.

Ce373a3291defccc69a1392feb587f17?s=128

Filipe Ximenes

July 20, 2015
Tweet

More Decks by Filipe Ximenes

Other Decks in Programming

Transcript

  1. What is wrong with API wrappers and how can we

    do better
  2. FILIPE XIMENES @xima

  3. Recife Recife

  4. http://www.vinta.com.br

  5. API Application Programming Interface

  6. What??? ◇ APIs define the interaction interface of a software.

    ◇ software might mean: ◦ a Python class ◦ a database ◦ some hardware ◦ some plugin ◦ a library ◦ a web service
  7. Eg.: Python class class User(object): name = '' email =

    '' def update_data(self, name, email): self.name = name self.email = email def talk(self, message): print('{} says: {}'.format(self.name, message))
  8. Eg.: web service GET /v1/media/000000 HOST: https://api.instagram.com POST /v1/media/000000/comments HOST:

    https://api.instagram.com DELETE /v1/media/000000/comment/111111 HOST: https://api.instagram.com
  9. Integrating web services

  10. I want to retrieve basic user data after he logs

    in using his facebook account.
  11. Our options ◇ Option 1 ◦ Read Facebook's API documentation.

    ◦ Use Python's urllib2 to make requests. ◇ Option 2 ◦ Read Facebook's API documentation. ◦ Use Requests lib to make requests ◇ Option 3 ◦ Search for an open source lib with ready to go python methods for making endpoint requests. ◦ Go to the beach.
  12. Web API libs, aka web API wrappers ◇ What is

    it? ◦ Implementation of a web API documentation using a programming language. ◇ What is it for? ◦ Creates a layer over HTTP using your favorite programming language ▪ authentication ▪ composing urls ▪ prepare requests ▪ process responses ▪ format data
  13. facepy

  14. facepy from facepy import GraphAPI graph = GraphAPI(oauth_access_token) my_links =

    graph.get(path='me/links', page=True) for link in my_links: print(link) # link is a dict
  15. facepy graph = GraphAPI(oauth_access_token) endpoint = '{}/{}'.format(user_id, 'statuses') data =

    ?? user_data = graph.post(endpoint, **data)
  16. Some notes ◇ Need to study facepy's documentation ◦ Request

    interfaces ◦ Parameter passing ◦ Response access ◦ Exception treatment ◇ Need to study Facebook's documentation ◦ Endpoints and HTTP methods available ◦ Parameters for each endpoint ◦ Data formatting for each request or response
  17. python-twitter

  18. python-twitter import twitter api = twitter.Api(consumer_key='consumer_key', consumer_secret='consumer_secret', access_token_key='access_token', access_token_secret='access_token_secret') statuses

    = api.GetUserTimeline( user_id=user_uid, count=20, since_id=id_of_first_tweet)
  19. python-twitter

  20. python-twitter

  21. Some notes ◇ pydoc documentation ◇ Not very pythonic code

    ◇ No pagination support ◇ A method for each endpoint ◇ Models instead of dictionaries
  22. I need a system that monitors Twitter, Facebook, Instagram, Blogger

    and Tumblr, to capture posts from each one of my users.
  23. The ideal wrapper ◇ Authentication ◇ Requests as the engine

    of requests ◇ Pagination support (generators) ◇ Exception raising according to error codes (403, 500...) ◇ Hypermedia support (links, HATEOAS) ◇ Explorable ◇ Simple documentation
  24. Tapioca Wrapper Delicious and comes in many flavours!

  25. None
  26. None
  27. tapioca-wrapper https://github.com/vintasoftware/tapioca-wrapper

  28. What's tapioca-wrapper? Python framework to create web API wrappers

  29. Demo time!! tapioca-facebook

  30. None
  31. Congratulations you now know how to use ANY tapioca wrapper

  32. Developing a tapioca wrapper

  33. The code Python https://github.com/vintasoftware/tapioca-facebook/ blob/master/tapioca_facebook/tapioca_facebook.py Endpoint mapping https://github.com/vintasoftware/tapioca-facebook/ blob/master/tapioca_facebook/resource_mapping.p y

  34. tapioca wrapper features ◇ A method for each endpoint ◇

    Explorable ◇ Requests lib ◇ Pagination support ◇ Hypermedia support ◇ Quick documentation access
  35. ~250 lines of code tapioca-facebook ~1,000 lines of code facepy

  36. ~6,000 lines of code python-twitter ~150 lines of code tapioca-twitter

  37. 1 hour tapioca-parse

  38. Notes ◇ We still need to read the API documentation

    but not the wrapper documentation. ◇ Fun to explore the package. ◇ Writing new flavours: ◦ Almost 100% declarative. ◦ Few lines of code. ◦ Batteries included. ◇ There's a lot more to improve.
  39. QUESTIONS? @xima github.com/filipeximenes ximenes@vinta.com.br www.vinta.com.br