LoginSignup
9
6

More than 5 years have passed since last update.

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

Posted at

はじめに

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 に向けて

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6