lua nginx moduleでjson形式のレスポンスを返す(cjson)
Debian 8でlua nginx moduleが動く環境を用意し、デバッグ方法を調べました。apt-getでDebian 8 + lua nginx moduleの環境構築(nginx-extras)
簡単な文字列をngx.sayで返却しましたが、json形式の文字列を返してみます。
cjson
luaでjsonを扱うにはcjsonが便利そうです。
lua-cjson-manual
aptでインストールできるか調べたところ、
# apt-cache search cjson
lua-cjson - JSON parser/encoder for Lua
lua-cjson-dev - JSON parser/encoder for Lua, development files
python-cjson - Very fast JSON encoder/decoder for Python
python-cjson-dbg - Very fast JSON encoder/decoder for Python (debug extension)
lua-cjsonでインストールできそうです。
# apt-get install lua-cjson
サンプル
こちらで作成した環境を使います。
apt-getでDebian 8 + lua nginx moduleの環境構築(nginx-extras)
nginxの設定ファイル(/etc/nginx/sites-available/default)の抜粋。
charset UTF-8;
charset_types application/json;
location / {
lua_code_cache off;
default_type 'application/json';
content_by_lua_file /var/dev/lua/sample.lua;
}
/var/dev/lua/sample.luaにプログラムを記載します。
- local cjson = require "cjson"
- value = { true, { foo = "bar" } }
- json_text = cjson.encode(value)
- ngx.say(json_text)
ブラウザで確認すると、ちゃんとjson形式の文字列になっているようです。
簡単なPythonのプログラムでも読み込みを試してみます。
- # -*- coding:utf-8 -*-
- import urllib2
- import json
- f = urllib2.urlopen('http://192.168.1.104/')
- json_text = f.read()
- print json_text
- print '-' * 10
- print json.loads(json_text)
ちゃんと復元できました。
$ python sample.py
[true,{"foo":"bar"}]
----------
[True, {u'foo': u'bar'}]
もう少し複雑な例
postでjson形式のデータを受け取り、内容に応じで値を返却してみます。
lua側のサンプル
- local cjson = require "cjson"
- -- bodyの解析
- ngx.req.read_body()
- -- body_dataを取得してみる
- local req_body = ngx.req.get_body_data()
- -- もし取得できていなかったら、データはファイルに行っている
- if not req_body then
- -- テンポラリのファイル名を取得。内容を全部読み込む
- local req_body_file_name = ngx.req.get_body_file()
- if req_body_file_name then
- local file = io.open(req_body_file_name, 'rb')
- req_body = file:read('*a')
- file:close()
- end
- end
- if not req_body then
- ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
- end
- -- postされた値を解析
- local post = cjson.decode(req_body)
- data = { status = 'ok', value = '取得したvalue:' .. post['value'] }
- json_text = cjson.encode(data)
- ngx.say(json_text)
リクエストの内容解析は過去の記事が役に立ちました。
nginx 1.6.2 + lua-nginx-moduleで簡易ファイルアップローダー
リクエストを送信するPython側のサンプル
- # -*- coding:utf-8 -*-
- import urllib2
- import json
- data = json.dumps({u'value':u'日本語'})
- f = urllib2.urlopen('http://192.168.1.104/', data)
- json_text = f.read()
- json_data = json.loads(json_text)
- print json_data['value']
実行結果
$ python sample.py
取得したvalue:日本語
日本語も問題なく処理できていますね。
【参考URL】
https://www.kyne.com.au/~mark/software/lua-cjson-manual.html
nginxで静的jsonファイル配信時に日本語が文字化けしないようにする
- 関連記事
コメント