週刊Elixirライブラリ2015-3

Elixirのライブラリの解説を週ごとにお届けする記事です。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。

今週はTrotについて

# Trot is 何?Elixirで使えるRubySinatra風味なWebフレームワークです。

# 実行環境
OS:OS X Yosemite
Erlang:Eshell V6.5, OTP-Version 18
Elixir:v1.0.4

# 参考資料
Trotフレームワークを使って"Hello Trot!!"するだけの簡単なお仕事・・・

# インストールについて
Hexを使用し、Trotをインストールする

$ mix new my_trot
$ cd my_trot
$ vim mix.exs

mix.exsの内容は以下のように記載を行います。
自動生成されたものからの変更内容に関しましては、def application do の中と、defp deps doになります。

defmodule MyTrot.Mixfile do
  use Mix.Project

  def project do
    [app: :my_trot,
     version: "0.0.1",
     elixir: "~> 1.0",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     deps: deps]
  end

  # Configuration for the OTP application
  #
  # Type `mix help compile.app` for more information
  def application do
    [applications: [:logger, :trot]]
  end

  # Dependencies can be Hex packages:
  #
  #   {:mydep, "~> 0.3.0"}
  #
  # Or git/path repositories:
  #
  #   {:mydep, git: "https://github.com/elixir-lang/mydep.git", tag: "0.1.0"}
  #
  # Type `mix help deps` for more examples and options
  defp deps do
    [
      {:trot, github: "hexedpackets/trot"}
    ]
  end
end

Trotに必要な依存関係を解決します。

$ mix deps.get
$ mix deps.compile

# Trotを使用してWebアプリケーションの動作を記載する
今回はHelloWorldとURLにname パラメータを指定して、指定されたパラメータを取得し、表示するプログラムとなります。

defmodule MyTrot do
  use Trot.Router

  get "/", do: 200

  get "/hello" do
    # ヘッダーのparamを取得するために実行
    # bodyのparamは下記のメソッドでは取得できない模様
    conn = fetch_query_params(conn)
    # URLからパラメータが取得できたかをコンソール表示(デバッグ用)
    IO.inspect conn.params
    # conn.params["name"]にて、ヘッダーにて取得されたパラメータの
    # name属性の値を表示するように指定
    "Hello Trot is #{conn.params["name"]}!!"
  end

  import_routes Trot.NotFound
end

ルーティングを明示的に指定するために設定の更新を行います。

$ vim config/config.exs

config.exsファイルの一番後ろに下記の設定を追加

# trotにて使用するポート番号を指定
config :trot, :port, 4000
# trotにてルーティングを行うソースコード名を指定
config :trot, :router, MyTrot

MyTrotを実行します

$ iex -S mix

以下のURLにアクセスを行います。
URL:http://localhost:4000/hello?name=test
出力結果:Hello Trot is test!!

ログは下記のように表示されます。

iex(1)> 
09:01:32.613 [info]  GET /hello
%{"name" => "test"}

09:01:32.623 [info]  Sent 200 in 9ms

# POST通信を行うには
ソースコードのgetと記載されていた場所をpostに変更することによりPOST通信に対応することができます。
アクセスを行う際にはURLを直接叩いてもGET通信のみしかできないためPOST通信を試せる専用のアプリケーションを使うか、HTMLを記載し、Formからのアクセスにて確認が行えます。

defmodule MyTrot do
  use Trot.Router

  get "/", do: 200

  post "/hello" do
    # ヘッダーのparamを取得するために実行
    # bodyのparamは下記のメソッドでは取得できない模様
    conn = fetch_query_params(conn)
    # URLからパラメータが取得できたかをコンソール表示(デバッグ用)
    IO.inspect conn.params
    # conn.params["name"]にて、ヘッダーにて取得されたパラメータの
    # name属性の値を表示するように指定
    "Hello Trot is #{conn.params["name"]}!!"
  end

  import_routes Trot.NotFound
end

# まとめ
今回は友人がTrotにてパラメータを使用し値渡しを行う方法がわからないとのことだったので挑戦してみました。
Plugのドキュメントにひっそりとのっている fetch_query_params の記述を発見するまでが大変だったりしましたが、Elixirのドキュメントを大事にする文化にふれて、良い文化だと感じました。

それでは皆様、良いElixirライフを