3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

こんにちは!
プログラミング未経験文系出身、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アクセストークンを取得しておきます

get_qiita_articlesという名前でmixプロジェクトを作成

bash
mix new get_qiita_articles
cd get_qiita_articles

HTTPoisonとは

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

HTTPoisonの導入方法

公式ドキュメント

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

image.png

mix.exsに書き込んで、mix deps.getします。

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
mix deps.get

関数を追加

Mixプロジェクト内に関数を追加します。
今回はQiitaの記事一覧から"Elixir"で検索をかけたときの結果一覧を取得します1

lib/get_qiita_articles.ex
+   def index do
+     "https://qiita.com/api/v2/items?query=elixir"
+     |> HTTPoison.get!()
+   end

使ってみた

iexを起動します

bash
iex -S mix

iex上で追加した関数を使用します

iex
GetQiitaArticles.index

下記のレスポンスが返ってきました

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:

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

We Are The Alchemists, my friends!:bouquet:2
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。3

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

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

  3. @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?