Guides to making a library to wrap an API

rest_api

#1

Hi, I would like to learn more about Elixir and thought creating a hex library might help me achieve this. I would like to wrap a third-party event/ticketing API that I am using for one of my current projects and then publish this to hex.

I have found an Elixir library for meetup.com’s API, and was thinking of using that as a base. Is that a good start? Are there any really good libraries out there that I could follow for wrapping APIs? Any Elixir patterns I should follow as well?

Btw, I am new to writing any library in any language, so trying to learn as much as I can and also contribute back to the ecosystem.

Thanks!


#2

A good place to start is playing with a library like Tesla or HTTPoison. Those libraries provide a simplified interface around more lower level HTTP clients like Hackney or Mint. You’ll probably need a way to configure authentication; ideally through function parameters or options. Tesla has a decent solution to build an authenticated client at run-time which is helpful to avoid imposing configuration methods on your users.

There are 4 main components to think about with a REST API wrapper:

  • The External Service who’s API you’re wrapping, how to authenticate with it, and what requests and responses can be made.
  • The Consumer of your library (e.g. the Business Logic), what it cares about, and the minimal set of knowledge it should have about how to interact with the service.
  • Your API Wrapper library, how it’s configured, how it authenticates with the External Service, how it validates incoming commands, and how it handles responses from the service.
  • The HTTP Client (e.g. Hackney/Mint) that does the actual work of executing an HTTP Request through the network stack.

The most important part is providing a clean interface between your business logic (consumer of the API Wrapper) to hide implementation details like HTTP request/response. Outside of that you’ll probably want to spend time thinking about how to configure your library.

These resources are worth looking at for Library configuration in general:

Hope this helps!


#3

Thanks, I got a lot to learn!