週刊Elixirライブラリ2015-3
Elixirのライブラリの解説を週ごとにお届けする記事です。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。
今週はTrotについて
# Trot is 何?Elixirで使えるRubyのSinatra風味な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ライフを