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.
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
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
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
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
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
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
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.