はじめに
ElixirにてCowboyの1.0.4を動かすサンプルコードの記事をこちらに記載しましたが、こちらの記事ではCowboy 2.0.0-pre4 にて動かすさいのサンプルになります。
バージョン
使用した言語やライブラリのバージョンは下記となります。
Version | |
---|---|
Elixir | 1.3.2 |
Erlang | 19.2 |
Cowboy | 2.0.0-pre4 |
プロジェクト作成
まずは、今回作成するプロジェクトの作成を行います。
今回はスーパーバイザの設定も行うため --sup
のオプションをつけてプロジェクトの作成を行います。
$ mix new elixir_cowboy_example --sup
コード
mix new
にてプロジェクトの作成が終わりましたら移動して、コードの記述を行っていきます。
まずは、 mix.exs
に今回使用する cowboy のバージョンと cowboy をアプリケーションで使用するむねの記載を追加します。
def application do
[applications: [:logger, :cowboy],
mod: {ElixirCowboyExample, []}]
end
defp deps do
[
{:cowboy, git: "https://github.com/ninenines/cowboy.git", tag: "2.0.0-pre.4"}
]
end
それでは続きましてメインの処理を記載していきましょう
elixir_cowboy_example.ex
にはスーパーバイザの設定とアクセスするURLなどの設定を行っていきます。
defmodule ElixirCowboyExample do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
# スーパーバイザの設定
children = [
worker(__MODULE__, [], function: :run)
]
opts = [strategy: :one_for_one, name: ElixirCowboyExample.Supervisor]
Supervisor.start_link(children, opts)
end
def run do
# ルーティングの設定
routes = [
{"/", ElixirCowboyExample.Handler, []}
]
# http アクセスする箇所の記載
dispatch = :cowboy_router.compile([{:_, routes}])
# opts と env の設定が cowboy1.0.4とは違っています
opts = [{:port, 4000}]
env = %{dispatch: dispatch}
{:ok, _pid} = :cowboy.start_clear(:http, 100, opts, %{env: env})
end
end
最後に routes
にて ElixirCowboyExample.Handler
の記載を行っていますので、Handlerの記載を行っていきます。
Handlerでは実際にアクセスが行われた際に、どのような応答を行うかの記載を行っていきます。
init
ですが cowboy 1.0.4
では、init/3
で定義するようになっていましたが、 cowboy 2.0
では、init/2
となったようです。
Cowboy 2.0.0 に向けて
defmodule ElixirCowboyExample.Handler do
def init(req, opts) do
headers = %{"content-type" => "text/plain"}
body = "Hello Cowboy!"
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
{:ok, resp, opts}
end
end
コードの記述に関しましては、上記で以上となります。
実行
さて、それでは実行していきましょう。
まずは mix deps.get
にて cowboyのダウンロードを行います。
その後に iex -S mix
で起動を行います。
$ mix deps.get
* Getting cowboy (https://github.com/ninenines/cowboy.git)
Cloning into '/elixir_cowboy_example/deps/cowboy'...
remote: Counting objects: 9017, done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 9017 (delta 7), reused 0 (delta 0), pack-reused 8992
Receiving objects: 100% (9017/9017), 5.19 MiB | 886.00 KiB/s, done.
Resolving deltas: 100% (5850/5850), done.
Checking connectivity... done.
* Getting cowlib (https://github.com/ninenines/cowlib)
Cloning into '/elixir_cowboy_example/deps/cowlib'...
remote: Counting objects: 915, done.
remote: Total 915 (delta 0), reused 0 (delta 0), pack-reused 915
Receiving objects: 100% (915/915), 455.51 KiB | 206.00 KiB/s, done.
Resolving deltas: 100% (599/599), done.
Checking connectivity... done.
* Getting ranch (https://github.com/ninenines/ranch)
Cloning into '/elixir_cowboy_example/deps/ranch'...
remote: Counting objects: 1434, done.
remote: Total 1434 (delta 0), reused 0 (delta 0), pack-reused 1434
Receiving objects: 100% (1434/1434), 493.51 KiB | 316.00 KiB/s, done.
Resolving deltas: 100% (890/890), done.
Checking connectivity... done.
$ iex -S mix
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
==> ranch (compile)
Compiled src/ranch_transport.erl
Compiled src/ranch_sup.erl
Compiled src/ranch_ssl.erl
Compiled src/ranch_tcp.erl
Compiled src/ranch_server.erl
Compiled src/ranch_protocol.erl
Compiled src/ranch_listener_sup.erl
Compiled src/ranch_app.erl
Compiled src/ranch_acceptors_sup.erl
Compiled src/ranch_acceptor.erl
Compiled src/ranch_conns_sup.erl
Compiled src/ranch.erl
==> cowlib (compile)
Compiled src/cow_uri.erl
Compiled src/cow_spdy.erl
Compiled src/cow_ws.erl
Compiled src/cow_qs.erl
Compiled src/cow_http_te.erl
Compiled src/cow_multipart.erl
Compiled src/cow_http2.erl
Compiled src/cow_http.erl
Compiled src/cow_mimetypes.erl
Compiled src/cow_date.erl
Compiled src/cow_hpack.erl
Compiled src/cow_cookie.erl
Compiled src/cow_http_hd.erl
==> cowboy (compile)
Compiled src/cowboy_middleware.erl
Compiled src/cowboy_sub_protocol.erl
Compiled src/cowboy_sup.erl
Compiled src/cowboy_tls.erl
Compiled src/cowboy_stream.erl
Compiled src/cowboy_stream_h.erl
Compiled src/cowboy_static.erl
Compiled src/cowboy_websocket.erl
Compiled src/cowboy_router.erl
Compiled src/cowboy_loop.erl
Compiled src/cowboy_req.erl
Compiled src/cowboy_http2.erl
Compiled src/cowboy_rest.erl
Compiled src/cowboy_constraints.erl
Compiled src/cowboy_handler.erl
Compiled src/cowboy_clear.erl
Compiled src/cowboy_bstr.erl
Compiled src/cowboy_clock.erl
Compiled src/cowboy_app.erl
Compiled src/cowboy.erl
Compiled src/cowboy_http.erl
Compiling 2 files (.ex)
Generated elixir_cowboy_example app
Interactive Elixir (1.3.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
さて起動が完了しましたら、ブラウザからアクセスしてみましょう
http://localhost:4000
にブラウザからアクセスし、Hello Cowboy!
と表示されれば成功です。
最後に
いかがだったでしょうか?
cowboy2.0でも、単純なbodyの内容を出すだけならば、それほどコードの変更はなく記載できているようです。
それではCowboy1.0の方と合わせて、次回はもう少し進んだ内容を記載したいと思いますので、よろしくお願いいたします。