Elixir、Cowboy2でhello worldを出力するところまでです。
Cowboy1系と書き方が変わってたり、ネットでサンプルみてもうまくいかなかったので
どこらへんの書き方が違ったかまとめていきたいと思います。
##mix.exs
#Cowboy1
defp deps do
[{:cowboy, "~> 1.0"}]
end
#Cowboy2
defp deps do
[{:cowboy, github: "ninenines/cowboy"}]
end
##cowboy1.ex
defmodule Cowboy1 do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
dispatch = :cowboy_router.compile routes
{:ok, _} = :cowboy.start_http :http, 100, [{:port, 3000}], [{:env, [{:dispatch, dispatch}]}]
children = [
]
opts = [strategy: :one_for_one, name: Cowboy1.Supervisor]
Supervisor.start_link(children, opts)
end
defp routes do
[
{:_, [
{"/", Cowboy1.Handlers.Hello, []},
]
}
]
end
end
##cowboy2.ex
defmodule Cowboy2 do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
dispatch = :cowboy_router.compile routes
{:ok, _} = :cowboy.start_clear(:http, 100, [{:port, 3000}], %{:env => %{:dispatch => dispatch}}) ←ここの書き方が変わった
children = [
]
opts = [strategy: :one_for_one, name: Cowboy2.Supervisor]
Supervisor.start_link(children, opts)
end
defp routes do
[
{:_, [
{"/[:id]", Cowboy2.Handlers.Hello, []}
]
}
]
end
end
##hello.ex
#Cowboy1
defmodule Cowboy1.Handlers.Hello do
def init(_type, req, []) do
{:ok, req, :no_state}
end
def handle(req, state) do
{:ok, reply} = :cowboy_req.reply 200, [{"content-type", "text/plain"}], "hello world, cowboy1", req
{:ok, reply, state}
end
def terminate(_, _, _), do: :ok
end
#Cowboy2
defmodule Cowboy2.Handlers.Hello do
def init(req, state) do ← initのパラメータが変わった
handle(req, state) ← 1系はinitのあとにhandleが呼ばれていたみたいが2系は呼ばれないみたい
end
def handle(req, state) do
{:ok, req} = :cowboy_req.reply( 200, %{"content-type" => "text/plain"}, "hello world, cowboy2", req) ←2番目の引数がMapになった
{:ok, req, state}
end
def terminate(_, _, _), do: :ok
end
たいした内容ではないですがサンプルのソースはgithubに置いてあります。