Elixir
cowboy
gumi Inc.Day 18

Elixir: PlugCowboyで簡単なルーティングを試す

PlugCowboyは、ErlangのwebサーバーCowboy用のPlugアダプタです。Pulgのドキュメントは「Installation」でPlugアダプタにPlugCowboyを使うものとしています。もっとも、リリースが2018年10月21日と最近のため、まとまった情報が少なく、比較的新しい記事でも以前の情報だったりします。本稿では、インストールから簡単なルーティングまでの流れをご紹介します。


mixでElixirプロジェクトをつくる

まずは、mix newコマンドでElixirプロジェクトをつくりましょう。--supオプションを加えると、OTPアプリケーションとしてPlugを起動できるひな形ができ上がります。つくられるファイルは以下のとおりです。

$ mix new my_plug --sup

* creating README.md

* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/my_plug.ex
* creating lib/my_plug/application.ex
* creating test
* creating test/test_helper.exs
* creating test/my_plug_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

cd my_plug
mix test

Run "mix help" for more commands.


PlugCowboyをインストールする

アプリケーションのディレクトリ(my_plug)に切り替えたら、mix.exsにつぎのようなPlugCowboyの依存関係を加えます。


mix.exs

defmodule MyPlug.MixProject do

def application do
[

applications: [:plug_cowboy]
]
end

defp deps do
[
{:plug_cowboy, "~> 2.0"}
]
end
end


そして、mix deps.getコマンドで依存関係を解決してください。

$ mix deps.get

Resolving Hex dependencies...

Dependency resolution completed:
New:
cowboy 2.6.1
cowlib 2.7.0
mime 1.3.1
plug 1.7.1
plug_cowboy 2.0.1
plug_crypto 1.0.0
ranch 1.7.1
* Getting plug_cowboy (Hex package)
* Getting cowboy (Hex package)
* Getting plug (Hex package)
* Getting mime (Hex package)
* Getting plug_crypto (Hex package)
* Getting cowlib (Hex package)
* Getting ranch (Hex package)


サンプルコードを動かす

mixプロジェクトのファイルlib/my_plug.exのモジュールMyPlugに、つぎのようなテスト用の関数を定めます(「Hello world」参照)。


lib/my_plug.ex

defmodule MyPlug do

import Plug.Conn
def init(options) do
# optionsの初期化
options
end
def call(conn, _opts) do
conn
|> put_resp_content_type("text/plain")
|> send_resp(200, "Hello world")
end
end

そして、mixプロジェクトをiexのセッションで開いてください。

$ iex -S mix

Plugアプリケーションの中で前掲モジュールを動かすのがつぎのコードです。ターミナルからサーバーが起ち上がります。http://localhost:4000/のURLを開くと、ページに"Hello world"のテキストが示されるでしょう。

iex> {:ok, _} = Plug.Cowboy.http MyPlug, []

{:ok, #PID<0.593.0>}

elixir_plug_002.png


ルーティングを使う

つぎに、ルーティングを定めます。ドキュメントのPlug.Routerを参考に、lib/router.exにつぎのようなモジュール(MyPlug.Router)をつくりました。


lib/router.ex

defmodule MyPlug.Router do

use Plug.Router
plug :match
plug :dispatch
get "/hello" do
send_resp(conn, 200, "Japan")
end
match _ do
send_resp(conn, 404, "not found")
end
end

lib/my_plug/application.exには、つぎのように監視する子プロセスを加えてください。


lib/my_plug/application.ex

defmodule MyPlug.Application do

def start(_type, _args) do
children = [
Plug.Cowboy.child_spec(scheme: :http, plug: MyPlug.Router, options: [port: 4000])
]

end
end


アプリケーションを起動するのはmix runコマンドです。そのままではすぐに終了してしまうので、--no-haltオプションで動作し続けるようにします。

$ mix run --no-halt

別に開いたコマンドラインツールから、リクエストを送りましょう。ここでは、curlを使います。

$ curl http://localhost:4000/hello

Japan
$ curl http://localhost:4000/oops
not found

qiita_12_006_002.png

これで、PlugCowboyでwebサーバーを起動し、リクエストをルーティングすることができました。