はじめに
ElixirにてCowboy2.0-pre4を直接動かすための記事となります。
前回の記事では、cowboyでplain textを表示しました。
cowboy にて plain textを表示しても。。。っということもありますので、今回はHTMLを表示します。
cowboy1.0にて同様の内容をおこなう記事はこちらになります。
バージョン
使用した言語やライブラリのバージョンは下記となります。
Version | |
---|---|
Elixir | 1.3.2 |
Erlang | 19.2 |
Cowboy | 2.0.0-pre4 |
HTMLを表示してみる
HTMLを表示するだけならば、Handlerにて content-type
をtext/html
に変更し、body
に htmlタグをつけてレスポンスを返すだけで実現可能です。
defmodule ElixirCowboyExample.Handler do
def init(req, opts) do
method = :cowboy_req.method(req)
{:ok, resp} = html_example(method, req)
{:ok, resp, opts}
end
def html_example("GET", req) do
headers = %{"content-type" => "text/html"}
body = """
<html>
<head>
<meta charset=\"utf-8\">
<title>Cowboy Hello!</title>
</head>
<body>
<h1>Cowboy Hello!!</h1>
</body>
</html>
"""
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
end
end
記載したコードの実行
コードの記述が完了しましたので、それでは実行していきましょう。
いつも通り iex -S mix
にて cowboy を実行していきます。
起動後に、ブラウザからアクセスを実施しましょう。
http://localhost:4000
にブラウザからアクセスすると、Hello Cowboy!
が今度はHTMLタグにて修飾されてでてくるはずです。
ファイルからHTMLの内容を取得
さてさて、HTMLの内容を表示しましたが、HTMLの内容をすべてElixirのコードの中に記載するのはよくはないですよね。
ですので、 index.html ファイルを作成し、その内容を表示するように修正していきます。
また今まで使用していたURLでは、今まで通りの画面にアクセスできるように route
の追加も行っていきます。
<html>
<head>
<meta charset=\"utf-8\">
<title>Cowboy Hello!</title>
</head>
<body>
<h1>Cowboy Hello!!</h1>
<h2>file load test<h2>
</body>
</html>
下記のコードにて、新たなroute
の追加を行います。
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
# http://localhost:4000 にアクセスしたら今までのページを
# http://localhost:4000/xxx にアクセスしたらindex.htmlを表示するように route を追加
routes = [
{"/", ElixirCowboyExample.Handler, []},
{"/:html", ElixirCowboyExample.Handler, []}
]
dispatch = :cowboy_router.compile([{:_, routes}])
opts = [{:port, 4000}]
env = %{dispatch: dispatch}
{:ok, _pid} = :cowboy.start_clear(:http, 100, opts, %{env: env})
end
end
下記のコードでは、http通信時の内容によって表示するHTMLの内容の変更を行っています。
defmodule ElixirCowboyExample.Handler do
def init(req, opts) do
# http通信時の method を取得
# cowboy2.0からは {method, req}ではなくなった
method = :cowboy_req.method(req)
# http//localhost:4000/xxx の xxx を取得
# cowboy2.0からは {param, req}ではなくなった
param = :cowboy_req.binding(:html, req)
{:ok, resp} = html_example(method, param, req)
{:ok, resp, opts}
end
# :undefined つまりは、 /xxx が存在していない場合の処理
def html_example("GET", :undefined, req) do
headers = %{"content-type" => "text/html"}
body = """
<html>
<head>
<meta charset=\"utf-8\">
<title>Cowboy Hello!</title>
</head>
<body>
<h1>Cowboy Hello!!</h1>
</body>
</html>
"""
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
end
# priv/static/html/index.html を取得し、その内容をレスポンス
def html_example("GET", param, req) do
headers = %{"content-type" => "text/html"}
{:ok, file} = File.read "priv/static/html/index.html"
body = file
{:ok, resp} = :cowboy_req.reply(200, headers, body, req)
end
end
記載したコードの実行
さて、再びコードの記述が完了しましたので実行していきます。
起動後に、ブラウザからアクセスを実施しますが、今回はhttp://localhost:4000/hoge
にブラウザからアクセスすると、下記の画像のように表示されるはずです。
また、 http://localhost:4000
にアクセスすると、今まで通りの Hello Cowboy!
のみの画面が出てくるはずです。
最後に
いかがだったでしょうか?
cowboy 2.0-pre4 でも cowboy 1.0 とほぼほぼ同じようにstaticなhtmlファイルを表示することができました。エラー時の処理などはもう少し必要かもしれませんが、htmlを表示するだけならば、これだけでも使おうと思えば使えます。
次回も楽しみにしていただければ幸いです。