Symfoware

Symfowareについての考察blog

elixir + cowboyでwebアプリ その3 json API

elixir + cowboyでGETやPOSTデータを取得する方法を調べてみました。
elixir + cowboyでwebアプリ その2 GET,POSTパラメーター

json形式のデータを受け取り、応答してくれるAPIを書いてみます。


exjsx



json形式へのエンコードはexjsxを使うことにしました。
elixir + exjsxでjsonのエンコード、デコード




mix.exs



このサンプルのためにmix newしました。

# mix new cowjson


mix.exsはこんな感じです。
※環境によっては、depsにcowboyやexjsxが必要だと思います。


・mix.exs


  1. defmodule Cowjson.Mixfile do
  2. use Mix.Project
  3. def project do
  4.     [app: :cowjson,
  5.      version: "0.0.1",
  6.      elixir: "~> 1.0",
  7.      build_embedded: Mix.env == :prod,
  8.      start_permanent: Mix.env == :prod,
  9.      deps: deps]
  10. end
  11. def application do
  12.     [
  13.         mod: {Cowjson, []},
  14.         applications: [:logger, :cowboy]
  15.     ]
  16. end
  17. defp deps do
  18.     []
  19. end
  20. end





その他のソース



自動生成されたlib/cowjson.ex

・lib/cowjson.ex


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





・lib/cowjsonServer.ex


  1. defmodule CowjsonServer.Supervisor do
  2. use Supervisor
  3. def start_link() do
  4.     {:ok, sup} = Supervisor.start_link(__MODULE__, :ok)
  5. end
  6. def init(:ok) do
  7.     {:ok, {{:one_for_one, 10, 10}, []}}
  8. end
  9. end






API本体です。
とりあえず、受け取ったデータをそのまま返しています。

・cowjsonHandler.ex


  1. defmodule Cowjson.Handler 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.     name = :proplists.get_value("name", postvals)
  12.     address = :proplists.get_value("address", postvals)
  13.     
  14.     # クライアントに返す値
  15.     # とりあえず、受け取った値をそのままリターン
  16.     api_result = %{"req_name" => name, "req_address" => address}
  17.     
  18.     # JSXでデコード
  19.     {:ok, api_result_json} = JSX.encode(api_result)
  20.     
  21.     # 内容を返却
  22.     { :ok, reply } = :cowboy_req.reply(
  23.      200,
  24.      [ {"content-type", "application/json"} ],
  25.      api_result_json,
  26.      request
  27.     )
  28.     {:ok, reply, state}
  29. end
  30. def terminate(reason, request, state) do
  31.     :ok
  32. end
  33. end




コンバイル&起動を行います。


# iex -S mix







クライアントサンプル



テスト用のクライアントサンプルはPythonで記載しました。

・sample.py


  1. # -*- coding:utf-8 -*-
  2. import urllib
  3. import urllib2
  4. import json
  5. def main():
  6.     url = 'http://192.168.1.102:8080/api'
  7.     data = {
  8.         u'name' : u'symfo',
  9.         u'address' : u'symfoware@example.com'
  10.     }
  11.     postval = urllib.urlencode(data)
  12.     request = urllib2.Request(url, data=postval)
  13.     response = urllib2.urlopen(request)
  14.     ret = response.read()
  15.     
  16.     print ret
  17.     
  18.     retjson = json.loads(ret)
  19.     print retjson['req_name']
  20.     print retjson['req_address']
  21. if __name__ == '__main__':
  22.     main()





実行してみると、狙い通りの応答が得られています。


$ python sample.py
{"req_address":"symfoware@example.com","req_name":"symfo"}
symfo
symfoware@example.com






ソースはこちらに。
elixir + cowboy + exjsxを使用したjson APIのサンプル

※Bitbucket、いつの間にかスニペットが使えるようになってました。

関連記事

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

  1. 2015/07/28(火) 21:58:36|
  2. Erlang
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<elixir + cowboyでwebアプリ その4 住所検索APIサンプル | ホーム | elixirでデバッグプリント IO.inspect (var_dump, p, print dir(obj))>>

コメント

コメントの投稿


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

トラックバック

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