1. Qiita
  2. 投稿
  3. Elixir

ElixirからCowboy 2.0を使ってみる Part 1

  • 4
    いいね
  • 0
    コメント
に投稿

はじめに

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 をアプリケーションで使用するむねの記載を追加します。

mix.exs
  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などの設定を行っていきます。

lib/elixir_cowboy_example.ex
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 に向けて

lib/elixir_cowboy_example/handler.ex
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!と表示されれば成功です。

スクリーンショット 2017-01-06 10.30.39.png

最後に

いかがだったでしょうか?
cowboy2.0でも、単純なbodyの内容を出すだけならば、それほどコードの変更はなく記載できているようです。
それではCowboy1.0の方と合わせて、次回はもう少し進んだ内容を記載したいと思いますので、よろしくお願いいたします。

参考サイト

Cowboy User Guide
Cowboy 2.0.0 に向けて

Comments Loading...