Symfoware

Symfowareについての考察blog

elixir + cowboyでwebアプリケーションを作成する その1 雛形

elixirとcowboyでwebアプリケーションを作ってみます。
OSはFreeBSD 10.1です。

内容はかなり手探りです。


cowboyのインストール



mixでインストールする方法もありますが、pkgが用意されています。


# pkg search cowboy
erlang-cowboy-1.0.2_1




pkg installでインストールしました。


# pkg install erlang-cowboy






mix new



mix newでプログラムの雛形を作成します。


# mix new cowsample




実行するとこんな出力と共に、cowsampleディレクトリが作成されます。


# mix new cowsample
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/cowsample.ex
* creating test
* creating test/test_helper.exs
* creating test/cowsample_test.exs

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

    cd cowsample
    mix test

Run `mix help` for more commands.




内容はこんな感じ。

630_01.png


cowsampleに移動して、お決まり(と思われる)コマンドを実行。


# cd cowsample/
# mix deps.get
# mix deps.compile
# iex -S mix




iexを実行すると、対話シェルが開始されます。
この時点で、コンパイル済のモジュールが読み込まれている模様。

自動的にbeamファイルが生成されていますね。

630_02.png


# iex -S mix
Erlang/OTP 18 [erts-7.0.2] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Compiled lib/cowsample.ex
Generated cowsample app
Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Cowsample
Cowsample






自動的に作成されたソースに手を加えてみます。

・cowsample.ex


  1. defmodule Cowsample do
  2.     def hello() do
  3.         IO.puts "hello world"
  4.     end
  5. end




再度、iex -S mixを実行
追加したメソッドを実行してみます。


# iex -S mix
Erlang/OTP 18 [erts-7.0.2] [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Compiled lib/cowsample.ex
Generated cowsample app
Interactive Elixir (1.0.5) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Cowsample.hello
hello world
:ok




なるほど、コンパイル後に対話シェルが起動するわけね。




cowbody



elixir + cowboyのドキュメントが見つけられなかったので、
サンプルソースを見ながら頑張ります。

参考にしたリポジトリ。
cowboy-elixir-example
server_bench


まず、mix newで自動的に生成された「cowsample.ex」に
cowboyの設定を記載します。

/pingで、Cowsample.Pingモジュールを呼び出す。
ポート8080で起動する。


・cowsample.ex


  1. defmodule Cowsample do
  2. def start(_type, _args) do
  3.     dispatch = :cowboy_router.compile([
  4.      { :_, [
  5.          {"/ping", Cowsample.Ping, []},
  6.      ]}
  7.     ])
  8.     
  9.     {:ok, _} = :cowboy.start_http(:http, 100, [{:port, 8080}], [{:env, [{:dispatch, dispatch}]}])
  10.     CowsampleServer.Supervisor.start_link
  11. end
  12. end




lib/cowsampleServer.exを新規作成。
Supervisor(多分、サーバー)の設定を記載します。
これは、ほぼお決まりの内容になるようです。

・cowsampleServer.ex


  1. defmodule CowsampleServer.Supervisor do
  2. use Supervisor
  3. def start_link() do
  4.     {:ok, sup} = Supervisor.start_link(__MODULE__, :ok)
  5. end
  6. def init(:ok) do
  7.     {:ok, {{:one_for_one, 10, 10}, []}}
  8. end
  9. end





次に、lib/cowsamplePing.exを新規作成。
リクエストを受けた時の処理内容を記載します。

・cowsamplePing.ex


  1. defmodule Cowsample.Ping do
  2. def init(_type, req, []) do
  3.     {:ok, req, :no_state}
  4. end
  5. def handle(request, state) do
  6.     { :ok, reply } = :cowboy_req.reply(
  7.      # status code
  8.      200,
  9.      # headers
  10.      [ {"content-type", "text/html"} ],
  11.      # body of reply.
  12.      "pong\n",
  13.      # original request
  14.      request
  15.     )
  16.     {:ok, reply, state}
  17. end
  18. def terminate(reason, request, state) do
  19.     :ok
  20. end
  21. end



pongという文字列を返すだけの処理です。


最後に、mix.exsに追記。
applicationにmodとして、Cowsampleを指定。
applicationsに、:cowboyを追記します。

これで、iex -S mixとやった時に、自動的にCowsampleが開始される。
ということだと解釈しています。

また、depsには依存するライブラリを記載しますが、
今回pkg installで依存ライブラリをインストールしているので、
記載は不要でした。

・mix.exs


  1. defmodule Cowsample.Mixfile do
  2. use Mix.Project
  3. def project do
  4.     [app: :cowsample,
  5.      version: "0.0.1",
  6.      elixir: "~> 1.0",
  7.      build_embedded: Mix.env == :prod,
  8.      start_permanent: Mix.env == :prod,
  9.      deps: deps]
  10. end
  11. def application do
  12.     [
  13.         mod: {Cowsample, []},
  14.         applications: [:logger, :cowboy]
  15.     ]
  16. end
  17. defp deps do
  18.     []
  19. end
  20. end




最終的なフォルダの状態はこうなります。

630_03.png



コンパイルと実行。


# iex -S mix



これで対話シェルに入りますが、既にサーバーは起動しています。
curlでアクセスして応答を確認します。


$ curl http://192.168.1.102:8080/ping
pong




やったー。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/07/27(月) 22:16:53|
  2. Erlang
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<elixir + cowboyでwebアプリ その2 GET,POSTパラメーター | ホーム | elixir + exjsxでjsonのエンコード、デコード>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1769-69f23b86
この記事にトラックバックする(FC2ブログユーザー)