Elixir 実装の Qiita API v2 Client を公開しました

  • 25
    Like
  • 7
    Comment
More than 1 year has passed since last update.

Qiita API v2 用の Elixir クライアント QiitaEx を公開したので、簡単な使い方、悩んだこと、ハマったことなどについて書きます。

作った理由

Qiita API v2 Hackathon が明日開催されます。参加したかったのですが都合がつかない。でも遠くからでも、雰囲気だけでも参加したい。ということで一人で一週間くらいチマチマと Qiita Hackathon して作りました。

それと去年も Elixir で Qiita API 作ろうとしたけど、途中で断念しちゃってたのでリベンジという意味もあります。

Output

ということで Qiita Hackathon で作ったものは以下に公開してあります。

How To Install

2つ紹介します。一つはプロジェクトへの追加方法、もう一つは iex で手軽に試す方法です。

プロジェクトへの追加方法

適当なプロジェクトを作り、mix.exs の application 関数と、deps 関数に :qiita_ex を追加します。

mix.exs
def application do
  [applications: [:logger, :qiita_ex]]  # <= ここと
end

defp deps do
  [
    {:qiita_ex, "~> 0.0.1"}             # <= ここね
  ]
end

それができたら mix deps.get して、qiita_ex をインストールします。

iex で試す方法

以下の通り。

$ git clone https://github.com/ma2gedev/qiita_ex.git
$ cd qiita_ex
$ mix deps.get
$ iex -S mix
# コンソールが立ち上がり QiitaEx を使える状態になります。

How To Use

まずは Qiita API v2 用の access token が必要なので、https://qiita.com/settings/tokens/new から取得してください。

iex 上では以下のように実行できます。

iex> response = QiitaEx.API.Users.get_user("<YOUR_ACCESS_TOKEN>", "ma2ge")
%QiitaEx.Response{  ...省略

QiitaEx.Response が返ってくるので、status_code, headers, body はそれぞれ以下のように取得できます。

iex> response.status_code
200
iex> response.headers
%{"Cache-Control" => "max-age=0, private, must-revalidate",  ...省略
iex> response.body
%{"description" => "Programmer", "facebook_id" => "", "followees_count" => 33,  ...省略

body は json を Elixir の map に変換して返します。headers は HTTPoison から返ってくるものそのままですが、こちらも map です。

その他の API については、lib/qiita_ex/api/ を見ていただけると分かりやすいかと思います。公式 document 側も合わせてみるとよいです(document 書いていない言い訳。。。)。

制限

Qiita Team を使っていないので、Qiita Team 関係の API は作ってないです。
その他、色々荒削りな感じになってます。

参考にしたもの

  • API の命名周りはほぼ qiita-rb です。
  • Elixir での API デザインについては extwitter, exlingr, elixir-dropbox などチェックしました

悩んだこと

access token の渡し方で悩む

config 形式と引数形式で悩んで、結局引数渡しにしました。

config 形式で extwitter のやり方だと、API 使う場合に config が共有されてしまう。結果他の access token と同時に使うことができなそうと思った(未調査)。

引数渡しで elixir-dropbox のように Client の struct 作るのも考えましたが、access token 渡すだけだし、そこまで作らなくていいかー。となり access token だけ渡す形にしました。

色々迷っているところもあるので、API の IF は後々変更するかもしれないです。ベストプラクティス的なものがあれば、そっちに移りたいですし。

ハマったこと

"Content-Type: application/json"

パラメータも全部渡しているし、qiita-rb でも同じパラメータでできるし何が違うの?意味分からない。ってときは大体 typo ですよねー。application が applicatoin になってました :scream:

必須パラメータ tags

上の問題が解決しても、投稿だけは上手くいかない。しかも qiita-rb でも上手くいかない。必須パラメータは全部渡しているはずなのに。。。

思い込みでした。必須パラメータ tags が足りていなかった。普段 Qiita 上で投稿するときは、基本的にタグつけてたから分からなかったけど、タグは必須要素だったんですね。ちゃんとドキュメント見とけという話でした。。。

最後に

一人でしたが、Qiita Hackathon 楽しかったです。無事ものを公開することまでできてよかった。後は GitHub の方へ :star: をつけていただければ私から言うことは特にないです :bow:

Resources

明日は @mururu さんです。