Calling a #JSON #REST #API with #Elixir
Elixir is based on Erlang, and is being used by some high profile software companies like Moz and Pinterest, I’ve just used it to develop a proof of concept app, which calls a JSON based API from here; https://www.regcheck.org.uk, returning car details based on a number plate. The code example below has the username/password removed, but you can create a free account for testing.
First off, if you haven’t done so; install elixir on OSX as follows;
Mac OS X
- Homebrew
- Update your homebrew to latest:
brew update
- Run:
brew install elixir
- Update your homebrew to latest:
Windows, and other platforms are available, and the code below is platform agnostic.
Create a new blank application by typing
mix new example
After. which, you cd into the example directory, and edit the mix.exs file to the following;
defmodule Example.Mixfile do
use Mix.Projectdef project do
[app: :example,
version: “0.1.0”,
elixir: “~> 1.4”,
escript: [main_module: Example], # <- add this line
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
deps: deps()]
enddef application do
[applications: [:logger, :httpotion]]
enddefp deps do
[
{:httpotion, “~> 3.0.2”},
{:poison, “~> 3.1”}
]
end
end
Lines that I have changed have been highlighted in bold, the line referring to escript defines the entry point, and the deps section determines the libraries I require to run my code example, here I am using httpotion, which is a HTTP client library, and Poison, which is a JSON parsing library.
The next step is to edit the file in lib/example.ex, with the following code (username and password removed)
defmodule Example do
def main(args) do
IO.puts “V 1.1.5”
IO.puts “Searching for Irish Reg Number: #{List.first(args)}”
response = HTTPotion.get “https://www.regcheck.org.uk/api/json.aspx/CheckIreland/#{List.first(args)}“, [basic_auth: {“username”, “password”}]
json = Poison.Parser.parse!(response.body)
IO.puts json[“Description”]
endend
Where I am calling a URL with basic authentication, receiving JSON back, then parsing that JSON to print it’s Description property to screen.
To run this application type:
$ mix deps.get
$ mix escript.build
$ ./example 05-D83975
where mix.deps.get gets the dependencies for the project, including Poison and Httpotion, and only needs to be run once.
mix escript.build compiles the application, and running ./example followed by an Irish car registration number builds it.
The car registration API not only runs in ireland, but also the UK, USA, Australia, India, South Africa and many other countries, you can check out RegCheck.org.uk for more details on this.
Getting following error for the same code :
** (Protocol.UndefinedError) protocol String.Chars not implemented for %HTTPotion.ErrorResponse{message: “closed”}. This protocol is implemented for: Atom, BitString, Date, DateTime, Float, Integer, List, NaiveDateTime, Time, URI, Version, Version.Requirement
LikeLike