LoginSignup
25
27

More than 5 years have passed since last update.

[elixir]phoenixとRedisでAPI作成

Posted at

elixirのWeb,APIフレームワークであるphoenixと、
KVSのRedisを使用しAPIを作成する。

mix phoenix.new api_sample
cd api_sample

依存ライブラリにexredisを追加

mix.exs
  defp deps do
    [{:phoenix, "~> 1.0.3"},
     {:phoenix_ecto, "~> 1.1"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_html, "~> 2.1"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:cowboy, "~> 1.0"},
     {:exredis, ">= 0.2.2"}
   ]
  end
mid deps.get

redisの接続情報を追加

config.exs
config :exredis,
  host: "127.0.0.1",
  port: 6379,
  password: "",
  db: 0,
  reconnect: :no_reconnect,
  max_queue: :infinity

pipe_through :browserを:apiに変更
PageControllerは一旦このままで。

router.ex
  scope "/", ApiSample do
    pipe_through :api # Use the default browser stack

    get "/", PageController, :index
  end

indexの戻り値をjsonにします。

page_controller.ex
defmodule ApiSample.PageController do
  use ApiSample.Web, :controller

  def index(conn, _params) do
    json conn, %{params: _params}
  end
end

サーバーを起動します。

mix phoenix.server

http://localhost:4000/?a=b
等へアクセス

以下の結果が取れました。

{
  params: {
    a: "b"
  }
}

testも書きます。

page_controller_test.ex
defmodule ApiSample.PageControllerTest do
  use ApiSample.ConnCase

  test "GET /" do
    conn = get conn(), "/?a=b"

    assert json_response(conn,200) == %{"params" => %{"a" => "b"}}
  end
end

Ectoの設定を色々コメントアウト等しないとテストが実行できないかもしれません。

mix test

Finished in 0.3 seconds (0.2s on load, 0.1s on tests)
1 test, 0 failures

無事テストが通りました。

では、次にRedisにデータをセットしたりゲットしたりしていきます。

router.ex
  scope "/", ApiSample do
    pipe_through :api # Use the default browser stack

    get "/", PageController, :index
    get "/get", PageController, :get 
  end

router.exにroutingを追加します。
/getを追加しました。

再びpage_controllerを修正します。

page_controller.ex
defmodule ApiSample.PageController do
  use ApiSample.Web, :controller
  import Exredis

  def index(conn, _params) do
    _params |> Enum.map fn {k, v} -> start_link |> elem(1) |> query ["SET", k, v] end
    json conn, %{params: _params}
  end

  def get(conn, %{"key" => key}) do
    json conn, %{ key: start_link |> elem(1) |> query ["GET", key] }
  end
end

単純に、setしてgetできるやつです。
indexは受け取ったパラメーターをredisにsetします。
getでは、パターンマッチで、keyというパラメータを受けています。
受け取ったkeyでredisからデータをgetします。

続いてテストも合わせて直します。(本当はテストから作るべきですね)

page_controller_test.exs
defmodule ApiSample.PageControllerTest do
  use ApiSample.ConnCase

  test "GET /" do
    conn = get conn(), "/?a=b"

    assert json_response(conn,200) == %{"status" => "ok"}
  end

  test "GET /get" do
    get conn(), "/a=b"
    conn = get conn(), "/get?key=a"

    assert json_response(conn,200) == %{"status" => "ok", "key" => "b"}
  end
end

出来ました!

まとめ

Redisの呼び方がいまいちですが、目的は達成です。
Redisのいい呼び方を考えます。

25
27
0

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
  3. You can use dark theme
What you can do with signing up
25
27