DEV Community

Masatoshi Nishiguchi
Masatoshi Nishiguchi

Posted on

ElixirのHTTPクライアントでお天気情報を取得したい(2022年)

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")
Enter fullscreen mode Exit fullscreen mode

https://qiita.com/torifukukaiou/items/4d842c6acae2b8967467

https://qiita.com/torifukukaiou/items/130a6ba0b16e1fddf24f

準備

IExを開く。

iex
Enter fullscreen mode Exit fullscreen mode

IEx内でいくつかHexパッケージをインストール。

Mix.install [:req, :httpoison, :tesla, :jason]
Enter fullscreen mode Exit fullscreen mode

Elixirで使えるHTTPクライアント

httpc

  • Erlangモジュールなので何もインストールしなくても使える。
  • シンプルなHTTPリクエストにはこれで十分。
  • HTTPレスポンスボディはCharlist
{:ok, {{_, 200, _}, _headers, body}} = :httpc.request("https://wttr.in/?format=j1")
body |> List.to_string() |> Jason.decode!()
Enter fullscreen mode Exit fullscreen mode

httpoison

  • Erlangで書かれたhackneyというライブラリを使いやすくラップしたもの。
  • hackneyはトラフィック量の多いシナリオに対応できていないらしい。
  • HTTPレスポンスボディはString
%HTTPoison.Response{status_code: 200, body: body} = HTTPoison.get!("https://wttr.in/?format=j1")
body |> Jason.decode!()
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

mint

  • TCP/SSLソケットを操作するための低レベルでプロセスを使用しないツール。
  • 単純なreceive/1ブロックでデータを取り込む。

finch

  • mintを使いやすくラップしたもの。
  • 軽量で高性能。

req

  • mintを使いやすくラップしたfinchをさらにラップした便利な高性能ツール。
  • HTTPレスポンスボディは解析済みのMap

書き方A

%Req.Response{status: 200, body: body} = Req.get!("https://wttr.in/?format=j1")
body
Enter fullscreen mode Exit fullscreen mode

書き方B

%Req.Response{status: 200, body: body} = (
  Req.build(:get, "https://wttr.in/?format=j1")
  |> Req.put_default_steps()
  |> Req.run!()
)

body
Enter fullscreen mode Exit fullscreen mode

Elixirコミュニティに初めて接する方は下記がオススメです

Elixirコミュニティ の歩き方 -国内オンライン編-

https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
image.png
日本には28箇所のElixirコミュニティがあります

image.png

日程からイベントを探すならElixirイベントカレンダー📆

** Elixirイベントカレンダー **

https://elixir-jp-calendar.fly.dev/
image.png

Top comments (0)