HTTPoison.get!の紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はHTTPoison.get!/3を使ってみて学んだことをまとめます。

# 目的
HTTPoison.get!/3の使いどころ、導入方法の紹介。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.17.0
Erlang v27.0

# 前提
## Qiita APIのアクセストークンを取得
下記の記事を参考にQiita APIの`read_qiita`アクセストークンを取得しておきます

https://qiita.com/koki_develop/items/57f86a1abc332ed2185d#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E7%99%BA%E8%A1%8C%E3%81%99%E3%82%8B

## `get_qiita_articles`という名前でmixプロジェクトを作成
```bash:bash
mix new get_qiita_articles
cd get_qiita_articles
```


# HTTPoisonとは
- Elixirで書けるHTTPクライアントのライブラリ(curl, POSTman, Talented API tester等と同じ)
- (パイプで書いた処理等を)APIリクエストするときや、HTTPレスポンスを分析する際に使用する

# HTTPoisonの導入方法
公式ドキュメント

https://hexdocs.pm/httpoison/readme.html

下記から画像の通りコピーでもいけます。

https://hex.pm/packages/httpoison

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/1dab6524-8411-a41a-73cb-92b3b456f5d0.png)


mix.exsに書き込んで、`mix deps.get`します。
```diff_elixir:mix.exs
defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
+       {:httpoison, "~> 2.2"}
    ]
  end
```

```bash:bash
mix deps.get
```

# 関数を追加
Mixプロジェクト内に関数を追加します。
今回はQiitaの記事一覧から"Elixir"で検索をかけたときの結果一覧を取得します[^1]
```diff_elixir:lib/get_qiita_articles.ex
+   def index do
+     "https://qiita.com/api/v2/items?query=elixir"
+     |> HTTPoison.get!()
+   end
```

# 使ってみた
iexを起動します
```bash:bash
iex -S mix
```
iex上で追加した関数を使用します
```diff_elixir:iex
GetQiitaArticles.index
```
下記のレスポンスが返ってきました
```diff_elixir:iex
%HTTPoison.Response{
  status_code: 200,
  body: "[{\"rendered_body\":\"\\u003cp data-sourcepos=\\\"1:1-2:83\\\"\\u003e\\u003cb\\u003e\\u003cfont color=\\\"red\\\"\\u003e$\\\\huge{元氣ですかーーーーッ！！！}$\\u003c/font\\u003e\\u003c/b\\u003e\\u003cbr\\u003e\\n\\u003cb\\u003e\\u003cfont color=\\\"red\\\"\\u003e$\\\\huge{元氣があればなんでもできる！}$\\u003c/font\\u003e\\u003c/b\\u003e\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"4:1-6:65\\\"\\u003e\\u003cb\\u003e\\u003cfont color=\\\"red\\\"\\u003e$\\\\huge{闘魂とは己に打ち克つこと。}$\\u003c/font\\u003e\\u003c/b\\u003e\\u003cbr\\u003e\\n\\u003cb\\u003e\\u003cfont color=\\\"red\\\"\\u003e$\\\\huge{そして闘いを通じて己の魂を磨いていく}$\\u003c/font\\u003e\\u003c/b\\u003e\\u003cbr\\u003e\\n\\u003cb\\u003e\\u003cfont color=\\\"red\\\"\\u003e$\\\\huge{ことだと思います}$\\u003c/font\\u003e\\u003c/b\\u003e\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"10:1-10:54\\\"\\u003e\\u003ciframe id=\\\"qiita-embed-content__36bd8d82e2a87f7b2f71ee773a7348ae\\\" src=\\\"https://qiita.com/embed-contents/link-card#qiita-embed-content__36bd8d82e2a87f7b2f71ee773a7348ae\\\" data-content=\\\"https%3A%2F%2Fqiita.com%2Fofficial-events%2F9ab96aa95d62fe3cbdd7\\\" frameborder=\\\"0\\\" scrolling=\\\"no\\\" loading=\\\"lazy\\\" style=\\\"width:100%;\\\" height=\\\"29\\\"\\u003e\\n\\u003c/iframe\\u003e\\n\\u003c/p\\u003e\\n\\u003ch1 data-sourcepos=\\\"12:1-12:14\\\"\\u003e\\n\\u003cspan id=\\\"はじめに\\\" class=\\\"fragment\\\"\\u003e\\u003c/span\\u003e\\u003ca href=\\\"#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\\\"\\u003e\\u003ci class=\\\"fa fa-link\\\"\\u003e\\u003c/i\\u003e\\u003c/a\\u003eはじめに\\u003c/h1\\u003e\\n\\u003cp data-sourcepos=\\\"14:1-14:238\\\"\\u003e本記事は、「\\u003ca href=\\\"https://qiita.com/official-events/9ab96aa95d62fe3cbdd7\\\"\\u003epaiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう！」\\u003c/a\\u003e」イベント記事です。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"16:1-16:67\\\"\\u003e私は\\u003ca href=\\\"https://elixir-lang.org/\\\" rel=\\\"nofollow noopener\\\" target=\\\"_blank\\\"\\u003eElixir\\u003c/a\\u003eで楽しんでみます。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"18:1-18:31\\\"\\u003eC問題をやってみます。\\u003c/p\\u003e\\n\\u003ch1 data-sourcepos=\\\"20:1-20:23\\\"\\u003e\\n\\u003cspan id=\\\"参考にした記事\\\" class=\\\"fragment\\\"\\u003e\\u003c/span\\u003e\\u003ca href=\\\"#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E8%A8%98%E4%BA%8B\\\"\\u003e\\u003ci class=\\\"fa fa-link\\\"\\u003e\\u003c/i\\u003e\\u003c/a\\u003e参考にした記事\\u003c/h1\\u003e\\n\\u003cp data-sourcepos=\\\"22:1-22:58\\\"\\u003e\\u003ca href=\\\"/RyoWakabayashi\\\" class=\\\"user-mention js-hovercard\\\" title=\\\"RyoWakabayashi\\\" data-hovercard-target-type=\\\"user\\\" data-hovercard-target-name=\\\"RyoWakabayashi\\\"\\u003e@RyoWakabayashi\\u003c/a\\u003e さんの記事を参考にしました。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"24:1-24:59\\\"\\u003e\\u003ciframe id=\\\"qiita-embed-content__d073aa5896a261a4a04e004e638db5fa\\\" src=\\\"https://qiita.com/embed-contents/link-card#qiita-embed-content__d073aa5896a261a4a04e004e638db5fa\\\" data-content=\\\"https%3A%2F%2Fqiita.com%2FRyoWakabayashi%2Fitems%2F7e65bd490677e069c54b\\\" frameborder=\\\"0\\\" scrolling=\\\"no\\\" loading=\\\"lazy\\\" style=\\\"width:100%;\\\" height=\\\"29\\\"\\u003e\\n\\u003c/iframe\\u003e\\n\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"26:1-26:182\\\"\\u003e\\u003ca href=\\\"https://atcoder.jp/\\\" rel=\\\"nofollow noopener\\\" target=\\\"_blank\\\"\\u003eAtCoder\\u003c/a\\u003eを\\u003ca href=\\\"https://elixir-lang.org/\\\" rel=\\\"nofollow noopener\\\" target=\\\"_blank\\\"\\u003eElixir\\u003c/a\\u003eで解く場合は、\\u003ccode\\u003eMain.main/0\\u003c/code\\u003e関数をエントリーポイントとして提出する必要があります。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"28:1-28:110\\\"\\u003e\\u003ca href=\\\"https://paiza.jp/\\\" rel=\\\"nofollow noopener\\\" target=\\\"_blank\\\"\\u003epaiza\\u003c/a\\u003eの場合はどうするのだろう？　と、そこを一番気にしました。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"30:1-30:186\\\"\\u003e自由でした。モジュールなしでもよさげで、モジュールを作った場合はそのエントリーポイントを一番最後に書いておけばよいようです。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"32:1-33:84\\\"\\u003e私は、\\u003cstrong\\u003e闘魂\\u003c/strong\\u003eを注入することにしたいと思います。\\u003cbr\\u003e\\nどういう意味なのかは、私の回答例をぜひ見てみてください。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"35:1-35:114\\\"\\u003eまた競技プログラミングですので入力の読み取り方は以下の記事を参考にしました。\\u003c/p\\u003e\\n\\u003cp data-sourcepos=\\\"37:1-37:60\\\"\\u003e\\u003ciframe id=\\\"qiita-embed-content__f71c0b73db82210f23333535ee79537a\\\" src=\\\"https://qiita.com/embed-contents/link-card#qiita-embed-content__f71c0b73db82210f23333535ee79537a\\\" data-content=\\\"https%3A%2F%2Fzenn.dev%2Ftorifukukaiou%2Farticles%2Fac84c87736ceebf4da01\\\" frameborder=\\\"0\\" <> ...,
  headers: [
    {"Date", "Tue, 20 Aug 2024 05:09:11 GMT"},
    {"Content-Type", "application/json; charset=utf-8"},
    {"Transfer-Encoding", "chunked"},
    {"Connection", "keep-alive"},
    {"Server", "nginx"},
    {"X-Frame-Options", "SAMEORIGIN"},
    {"X-XSS-Protection", "1; mode=block"},
    {"X-Content-Type-Options", "nosniff"},
    {"X-Download-Options", "noopen"},
    {"X-Permitted-Cross-Domain-Policies", "none"},
    {"Referrer-Policy", "strict-origin-when-cross-origin"},
    {"Link",
     "<https://qiita.com/api/v2/items?page=1&query=elixir>; rel=\"first\", <https://qiita.com/api/v2/items?page=2&query=elixir>; rel=\"next\", <https://qiita.com/api/v2/items?page=295&query=elixir>; rel=\"last\""},
    {"Total-Count", "5883"},
    {"ETag", "W/\"95e85fe537138d573a2c7b6e80e763a6\""},
    {"Cache-Control", "max-age=0, private, must-revalidate"},
    {"Rate-Limit", "60"},
    {"Rate-Remaining", "58"},
    {"Rate-Reset", "1724133877"},
    {"vary", "Origin"},
    {"X-Request-Id", "2be4cd77-3b4a-4ce0-9507-42a0881ac8cd"},
    {"X-Runtime", "0.664247"},
    {"Strict-Transport-Security", "max-age=2592000"}
  ],
  request_url: "https://qiita.com/api/v2/items?query=elixir",
  request: %HTTPoison.Request{
    method: :get,
    url: "https://qiita.com/api/v2/items?query=elixir",
    headers: [],
    body: "",
    params: %{},
    options: []
  }
}
```


`HTTPoison.get!/3`を使用してHTTPのGETメソッドをリクエストすることができました(^▽^)/
レスポンスはマップの形式をしているので、ここからパイプをつなげて色々できそうです。

# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian


[^1]:QiitaのAPIリファレンス https://qiita.com/api/v2/docs

[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！