はじめに
ElixirにてCowboyを直接動かすサンプルコードの日本語の記事が見つからなかったので、記載していけるだけ記載していこうと思い記事をあげました。
今回は最初のサンプルなのでCowboyにて hello Cowboy を表示していきます。
Cowboy 2.0.0-pre4 のサンプルに関しては、こちらになります。
バージョン
使用した言語やライブラリのバージョンは下記となります。
Version | |
---|---|
Elixir | 1.3.2 |
Erlang | 19.2 |
Cowboy | 1.0.4 |
プロジェクト作成
まずは、今回作成するプロジェクトの作成を行います。
今回はスーパーバイザの設定も行うため --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, "~> 1.0.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, []}
]
dispatch = :cowboy_router.compile([{:_, routes}])
# http アクセスする箇所の記載
opts = [port: 4000]
env = [dispatch: dispatch]
{:ok, _pid} = :cowboy.start_http(:http, 100, opts, [env: env])
end
end
最後に routes
にて ElixirCowboyExample.Handler
の記載を行っていますので、Handlerの記載を行っていきます。
Handlerでは実際にアクセスが行われた際に、どのような応答を行うかの記載を行っていきます。
defmodule ElixirCowboyExample.Handler do
def init({:tcp, :http}, req, opts) do
headers = [{"content-type", "text/plain"}]
body = "Hello Cowboy!"
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
{:ok, resp, opts}
end
def handle(req, state) do
{:ok, req, state}
end
def terminate(_reason, _req, _state) do
:ok
end
end
コードの記述に関しましては、上記で以上となります。
実行
さて、それでは実行していきましょう。
まずは mix deps.get
にて cowboyのダウンロードを行います。
その後に iex -S mix
で起動を行います。
$ mix deps.get
Running dependency resolution...
Dependency resolution completed:
cowboy 1.0.4
cowlib 1.0.2
ranch 1.2.1
* Getting cowboy (Hex package)
Checking package (https://repo.hex.pm/tarballs/cowboy-1.0.4.tar)
Using locally cached package
* Getting cowlib (Hex package)
Checking package (https://repo.hex.pm/tarballs/cowlib-1.0.2.tar)
Using locally cached package
* Getting ranch (Hex package)
Checking package (https://repo.hex.pm/tarballs/ranch-1.2.1.tar)
Using locally cached package
$ 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_server.erl
Compiled src/ranch_protocol.erl
Compiled src/ranch_listener_sup.erl
Compiled src/ranch_tcp.erl
Compiled src/ranch_ssl.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_spdy.erl
Compiled src/cow_qs.erl
src/cow_multipart.erl:392: Warning: crypto:rand_bytes/1 is deprecated and will be removed in a future release; use crypto:strong_rand_bytes/1
Compiled src/cow_multipart.erl
Compiled src/cow_http_te.erl
Compiled src/cow_http_hd.erl
Compiled src/cow_date.erl
Compiled src/cow_http.erl
Compiled src/cow_cookie.erl
Compiled src/cow_mimetypes.erl
==> cowboy (compile)
Compiled src/cowboy_middleware.erl
Compiled src/cowboy_sub_protocol.erl
Compiled src/cowboy_sup.erl
Compiled src/cowboy_websocket_handler.erl
Compiled src/cowboy_static.erl
Compiled src/cowboy_router.erl
Compiled src/cowboy_spdy.erl
Compiled src/cowboy_websocket.erl
Compiled src/cowboy_protocol.erl
Compiled src/cowboy_rest.erl
Compiled src/cowboy_loop_handler.erl
Compiled src/cowboy_http_handler.erl
Compiled src/cowboy_handler.erl
Compiled src/cowboy_clock.erl
Compiled src/cowboy_bstr.erl
Compiled src/cowboy_app.erl
Compiled src/cowboy.erl
Compiled src/cowboy_http.erl
Compiled src/cowboy_req.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!
と表示されれば成功です。
最後に
いかがだったでしょうか?
っと言っても、単純に body
に設定した Hello Cowboy!
を表示しているだけですので、それほど難しくはなかったのではないでしょうか。
次回からはもう少し進んだ内容を記載していきたいと思いますのでよろしくお願いいたします。
参考サイト
Cowboy User Guide
Cowboy Tutorial Part 2: Creating Flat File Blog