Symfoware

Symfowareについての考察blog

elixir + cowboyでwebアプリ その2 GET,POSTパラメーター

elixir + cowboyでwebアプリケーションを作成する その1 雛形
こちらの続きです。

pongと応答するサーバーが作れたので、
GETやPOSTパラメーターを取得し、応答するプログラムを作ってみます。


GET



ファイルの構成は前回と同じです。

修正箇所は2点。
dispathで指定するurlにatomでパラメーター名を指定しておきます。
これで、/ping/[パラメーター]というurlでアクセスできます。

・cowsample.ex


  1. defmodule Cowsample do
  2. def start(_type, _args) do
  3.     dispatch = :cowboy_router.compile([
  4.      { :_, [
  5.          {"/ping/:name", Cowsample.Ping, []},
  6.      ]}
  7.     ])
  8.     
  9.     {:ok, _} = :cowboy.start_http(:http, 100, [{:port, 8080}], [{:env, [{:dispatch, dispatch}]}])
  10.     CowsampleServer.Supervisor.start_link
  11. end
  12. end





次に、cowsamplePing.ex
:cowboy_req.bindingに、dispatchで指定したatomを使用して、
リクエストからパラメーターを抜き出します。

・cowsamplePing.ex


  1. defmodule Cowsample.Ping do
  2. def init(_type, req, []) do
  3.     {:ok, req, :no_state}
  4. end
  5. def handle(request, state) do
  6.     
  7.     # requestからパラメーターを取得
  8.     {name, req2} = :cowboy_req.binding(:name, request)
  9.     
  10.     { :ok, reply } = :cowboy_req.reply(
  11.      200,
  12.      [ {"content-type", "text/html"} ],
  13.      "hello " <> name <> "\n",
  14.      request
  15.     )
  16.     {:ok, reply, state}
  17. end
  18. def terminate(reason, request, state) do
  19.     :ok
  20. end
  21. end




curlでテスト。


$ curl http://192.168.1.102:8080/ping/symfo
hello symfo



パラメーターに指定した文字列を付けて、応答してくれました。






POST



POSTデータの取得方法を見てみます。
こちらが参考になりました。
cowboy/examples/echo_post

dispatchの変更は元に戻しておきます。

・cowsample.ex


  1. defmodule Cowsample do
  2. def start(_type, _args) do
  3.     dispatch = :cowboy_router.compile([
  4.      { :_, [
  5.          {"/ping", Cowsample.Ping, []},
  6.      ]}
  7.     ])
  8.     
  9.     {:ok, _} = :cowboy.start_http(:http, 100, [{:port, 8080}], [{:env, [{:dispatch, dispatch}]}])
  10.     CowsampleServer.Supervisor.start_link
  11. end
  12. end





リクエストの処理部分はこうなりました。
Erlangの標準関数を持ち込むときは、:atom.methodとするのか。

・cowsamplePing.ex


  1. defmodule Cowsample.Ping do
  2. def init(_type, req, []) do
  3.     {:ok, req, :no_state}
  4. end
  5. def handle(request, state) do
  6.     
  7.     # requestからPOSTパラメーターを取得
  8.     {:ok, postvals, req2} = :cowboy_req.body_qs(request)
  9.     
  10.     
  11.     # :proplists.get_valueで、値を取得
  12.     # http://www.erlang.org/doc/man/proplists.html
  13.     name = :proplists.get_value("name", postvals)
  14.     
  15.     { :ok, reply } = :cowboy_req.reply(
  16.      200,
  17.      [ {"content-type", "text/html"} ],
  18.      "hello " <> name <> "\n",
  19.      request
  20.     )
  21.     {:ok, reply, state}
  22. end
  23. def terminate(reason, request, state) do
  24.     :ok
  25. end
  26. end





curlで、-dオプションでpostの内容を指定し、テストしてみます。


$ curl -d name=symfo http://192.168.1.102:8080/ping
hello symfo
$ curl -d name=symfoware http://192.168.1.102:8080/ping
hello symfoware



狙い通りです。





Request Body



リクエストされたbody全体を取得したい場合。
:cowboy_req.body(request)を使用すればOK。

こちらを参考にしました。
http://ninenines.eu/docs/en/cowboy/HEAD/manual/cowboy_req/


cowsamplePing.exを修正します。

・cowsamplePing.ex


  1. defmodule Cowsample.Ping do
  2. def init(_type, req, []) do
  3.     {:ok, req, :no_state}
  4. end
  5. def handle(request, state) do
  6.     
  7.     # requestからPOSTデータを取得
  8.     {:ok, postdata, req2} = :cowboy_req.body(request)
  9.     
  10.     { :ok, reply } = :cowboy_req.reply(
  11.      200,
  12.      [ {"content-type", "text/html"} ],
  13.      "hello " <> postdata <> "\n",
  14.      request
  15.     )
  16.     {:ok, reply, state}
  17. end
  18. def terminate(reason, request, state) do
  19.     :ok
  20. end
  21. end




curlでテスト。


$ curl -d name=symfoware http://192.168.1.102:8080/ping
hello name=symfoware
$ curl -d symfo http://192.168.1.102:8080/ping
hello symfo




いい感じです。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/07/27(月) 23:21:44|
  2. Erlang
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<elixirでデバッグプリント IO.inspect (var_dump, p, print dir(obj)) | ホーム | elixir + cowboyでwebアプリケーションを作成する その1 雛形>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1770-cd3e7c65
この記事にトラックバックする(FC2ブログユーザー)