下準備
$ 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 のプロセス立ち上げる必要があるため??