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

Qiita API v2 用の Elixir クライアント [QiitaEx](https://hex.pm/packages/qiita_ex) を公開したので、簡単な使い方、悩んだこと、ハマったことなどについて書きます。

## 作った理由

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

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

## Output

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

- Hex: https://hex.pm/packages/qiita_ex
- GitHub: https://github.com/ma2gedev/qiita_ex

## How To Install

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

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

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

```elixir: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 で試す方法

以下の通り。

```bash
$ 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
iex> response = QiitaEx.API.Users.get_user("<YOUR_ACCESS_TOKEN>", "ma2ge")
%QiitaEx.Response{  ...省略
```

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

```iex
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/](https://github.com/ma2gedev/qiita_ex/tree/master/lib/qiita_ex/api) を見ていただけると分かりやすいかと思います。[公式 document](http://qiita.com/api/v2/docs) 側も合わせてみるとよいです(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](https://github.com/ma2gedev/qiita_ex) の方へ :star: をつけていただければ私から言うことは特にないです :bow:


## Resources

- Qiita API v2 Document
    - http://qiita.com/api/v2/docs
- 設計の参考にした API とか
    - https://github.com/increments/qiita-rb
    - https://github.com/ammmir/elixir-dropbox/blob/master/lib/dropbox.ex
    - https://github.com/parroty/extwitter
    - https://github.com/mtwtkman/exlingr


明日は @mururu さんです。