LoginSignup
7
8

More than 5 years have passed since last update.

Elixir の HTTPotion を使って Qiita API にアクセスしてみる

Last updated at Posted at 2013-12-12

下準備

$ mix new qiita --bare
$ cd qiita/

mix.exs を開いて deps 関数を以下のように書く。HTTP API として HTTPotion を使い、json の処理ように jsx を使うようにします。

  defp deps do
    [
      { :httpotion, github: "myfreeweb/httpotion" },
      { :jsx, github: "talentdeficit/jsx" }
    ]
  end

書けたらライブラリの依存関係を解決します。

$ mix deps.get

コード

そして lib/qiita.ex ファイルには以下を書きます。HTTPotion の README にサンプルコードとして載っている、GitHub API のパクリです。

defmodule Qiita do
  use HTTPotion.Base
  def process_url(url) do
    "https://qiita.com/api/v1/" <> url
  end

  def process_response_body(body) do
    json = :jsx.decode to_string(body)
    atomize_keys_json = Enum.map json, fn ({k,v}) -> { binary_to_atom(k), v } end
    :orddict.from_list atomize_keys_json
  end
end

これでコードは終わりです。HTTPotion.Base を use することで get, post, delete など使えるようになるのですが短いコードが cool ですね。ちなみに HTTPotion 自体も1ファイルだけで実装されています。HTTPotion が依存している ibrowse が結構頑張っているんですかね?
話がそれましたが一先ずこれで最低限のところまでできたので、後は試しに Qiita にアクセスしてみます。
まずはユーザ情報を取ってきてみます。

$ iex -S mix
iex(1)> Qiita.start
:ok
iex(2)> body = Qiita.get("users/ma2ge").body
...
iex(3)> body[:github]
"ma2gedev"

取れてるっぽいですね。次は post の例として投稿してみます。YOUR_TOKEN 部分は自分のものに置き換えてください。

iex(1)> Qiita.post("items?token=YOUR_TOKEN", ["title=test&tags[][name]=elixir&body=test from elixir api client&private=true"])
HTTPotion.Response[status_code: 201,
...

201 ということで投稿されました。
body の渡し方が分からずハマりましたが、文字列として直接表現すれば良かったぽいです。TOKEN 取得するまで結構かかりました。。
このままだと少し使いづらいので、ハッシュぽく渡せるようにすると API としてよくなりそうですね。

まとめ

HTTPotion 使ったら Qiita API にアクセスするのも、結構間単にできた。他にも HTTPoison という HTTP ライブラリもあるので、色々試してみるのもいいかもしれない。
今回のサンプルコードはgithubにおいておきました。

このエントリは Elixir Advent Calendar 2013 の12日目でした。明日は @udzura さんです!

メモ

Qiita.start 呼ぶのが必須ぽいのですが、まだ理由を調べきれていないです。Erlang のプロセス立ち上げる必要があるため??

7
8
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
7
8