search
LoginSignup
22

More than 5 years have passed since last update.

posted at

updated at

Organization

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

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 さんです。

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
What you can do with signing up
22