elixirのWeb,APIフレームワークであるphoenixと、
KVSのRedisを使用しAPIを作成する。
mix phoenix.new api_sample
cd api_sample
依存ライブラリにexredis
を追加
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 :exredis,
host: "127.0.0.1",
port: 6379,
password: "",
db: 0,
reconnect: :no_reconnect,
max_queue: :infinity
pipe_through :browserを:apiに変更
PageControllerは一旦このままで。
scope "/", ApiSample do
pipe_through :api # Use the default browser stack
get "/", PageController, :index
end
indexの戻り値をjsonにします。
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も書きます。
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にデータをセットしたりゲットしたりしていきます。
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を修正します。
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します。
続いてテストも合わせて直します。(本当はテストから作るべきですね)
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のいい呼び方を考えます。