HTTP GET JSON fetcher with timeout in Elixir
Elixir
defmodule HttpJson do
def get(url, timeout \\ 5_000) do
:inets.start()
:ssl.start()
request = {String.to_charlist(url), [{~c"accept", ~c"application/json"}]}
opts = [timeout: timeout, connect_timeout: timeout]
case :httpc.request(:get, request, opts, body_format: :binary) do
{:ok, {{_, status, _}, _, body}} when status in 200..299 ->
try do
{:ok, :json.decode(body)}
rescue
_ -> {:error, {:invalid_json, body}}
end
{:ok, {{_, status, _}, _, _body}} -> {:error, {:http_status, status}}
{:error, reason} -> {:error, reason}
end
end
end