あさた研メモ

主に私が気づいたこととか困った時のメモとか書き留めとく用。

Phoenix Frameworkでお手軽にAPI作成

環境

プロジェクト作成

表示関連はいらないのでオプションで指定する。

$ mix phx.new api_project --no-html --no-webpack

DBでMySQLを使いたいときは --database=mysql も必要。

その後は表示に従って、

$ cd api_project
$ mix ecto.create

を実行する。

データモデル作成

今回はjsonを返すAPIを作るので、そのためのデータモデルを作成する。

phx.gen.json – Phoenix v1.4.0

$ mix phx.gen.json Blog Article articles title:string body:text

表示に従って、ルーティングの追加とマイグレーションをする。

defmodule ApiProject,Router do
  use ApiProjectWeb, :router

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/api", ApiProjectWeb do
    pipe_through :api

    # 以下を追加
    resources "/articles", ArticleController, except: [:new, :edit]
  end
end

上記を変更したらマイグレーション

$ mix exto.migrate

実行

$ iex -S mix phx.server

http://localhost:4000/api/articles へ以下のようにPOSTするとデータが登録できる。

{
  "article": {
    "title": "記事のタイトル",
    "body": "記事の本文"
  }
}

レスポンスで以下のようなものが帰ってきたら成功。

{
  "data": {
    "title": "記事のタイトル",
    "id": 1
    "body": "記事の本文"
  }
}

http://localhost:4000/api/articles をGETすると一覧が見れる。(データは上のレスポンスの内容と一致してるはず)

tips

resources "/articles", ArticleController, except: [:new, :edit]

上記の except: [:new, edit] の箇所でHTTPメソッドの制限ができる。

例えば表示だけにしたければ

resources "/articles", ArticleController, only: [:index, :show]

とかやるとGETだけ受け付けるようになる。

ルーティングがどうなってるのか知りたければ、

$ mix phx.routes

で一覧を見れるので、そこを見ながらやると良さそう。