ElixirのHTTPクライアントについて検索してみるといろいろ出てきます。中には廃盤になったものもいくつかあります。先日Alex KoutmosさんのThe State of Elixir HTTP Clientsという記事を読んで、2022年現在で使えるHTTPクライアントがわかったので、それらを使用して簡単なGETリクエストでお天気情報を取得してみようと思います。
TL;DR
迷ったらreqを使うのが無難。
%Req.Response{status: 200, body: body} = Req.get!("https://wttr.in/?format=j1")
準備
IExを開く。
iex
IEx内でいくつかHexパッケージをインストール。
Mix.install [:req, :httpoison, :tesla, :jason]
Elixirで使えるHTTPクライアント
httpc
{:ok, {{_, 200, _}, _headers, body}} = :httpc.request("https://wttr.in/?format=j1")
body |> List.to_string() |> Jason.decode!()
httpoison
%HTTPoison.Response{status_code: 200, body: body} = HTTPoison.get!("https://wttr.in/?format=j1")
body |> Jason.decode!()
tesla
- Rubyのfaradayにインスパイアされたらしい。
- plugに似た形でミドルウエアを追加できる。
- HTTPクライアントをモジュールとして構成したい場合に便利。
- テストのモックを用意できる。
- HTTPレスポンスボディは解析済みのMap。
defmodule Weather do
use Tesla
plug Tesla.Middleware.BaseUrl, "https://wttr.in"
plug Tesla.Middleware.JSON
def get!() do
get!("/?format=j1")
end
end
%Tesla.Env{status: 200, body: body} = Weather.get!()
body
mint
- TCP/SSLソケットを操作するための低レベルでプロセスを使用しないツール。
- 単純なreceive/1ブロックでデータを取り込む。
finch
- mintを使いやすくラップしたもの。
- 軽量で高性能。
req
書き方A
%Req.Response{status: 200, body: body} = Req.get!("https://wttr.in/?format=j1")
body
書き方B
%Req.Response{status: 200, body: body} = (
Req.build(:get, "https://wttr.in/?format=j1")
|> Req.put_default_steps()
|> Req.run!()
)
body
Elixirコミュニティに初めて接する方は下記がオススメです
Elixirコミュニティ の歩き方 -国内オンライン編-
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
日本には28箇所のElixirコミュニティがあります
日程からイベントを探すならElixirイベントカレンダー
** Elixirイベントカレンダー **
https://elixir-jp-calendar.fly.dev/