LoginSignup
4
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-06

はじめに

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

mix.exs
  def application do
    [applications: [:logger, :cowboy],
     mod: {ElixirCowboyExample, []}]
  end

  defp deps do
    [
      {:cowboy, "~> 1.0.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, []}
    ]

    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では実際にアクセスが行われた際に、どのような応答を行うかの記載を行っていきます。

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

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

最後に

いかがだったでしょうか?
っと言っても、単純に body に設定した Hello Cowboy! を表示しているだけですので、それほど難しくはなかったのではないでしょうか。
次回からはもう少し進んだ内容を記載していきたいと思いますのでよろしくお願いいたします。

参考サイト

Cowboy User Guide
Cowboy Tutorial Part 2: Creating Flat File Blog

4
0
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
4
0