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にプログラムを記載します。


  1. local cjson = require "cjson"
  2. value = { true, { foo = "bar" } }
  3. json_text = cjson.encode(value)
  4. ngx.say(json_text)




ブラウザで確認すると、ちゃんとjson形式の文字列になっているようです。

739_01.png


簡単なPythonのプログラムでも読み込みを試してみます。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. f = urllib2.urlopen('http://192.168.1.104/')
  5. json_text = f.read()
  6. print json_text
  7. print '-' * 10
  8. print json.loads(json_text)




ちゃんと復元できました。


$ python sample.py
[true,{"foo":"bar"}]

----------
[True, {u'foo': u'bar'}]






もう少し複雑な例



postでjson形式のデータを受け取り、内容に応じで値を返却してみます。

lua側のサンプル


  1. local cjson = require "cjson"
  2. -- bodyの解析
  3. ngx.req.read_body()
  4. -- body_dataを取得してみる
  5. local req_body = ngx.req.get_body_data()
  6. -- もし取得できていなかったら、データはファイルに行っている
  7. if not req_body then
  8.     -- テンポラリのファイル名を取得。内容を全部読み込む
  9.     local req_body_file_name = ngx.req.get_body_file()
  10.     if req_body_file_name then
  11.         local file = io.open(req_body_file_name, 'rb')
  12.         req_body = file:read('*a')
  13.         file:close()
  14.     end
  15. end
  16. if not req_body then
  17.     ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
  18. end
  19. -- postされた値を解析
  20. local post = cjson.decode(req_body)
  21. data = { status = 'ok', value = '取得したvalue:' .. post['value'] }
  22. json_text = cjson.encode(data)
  23. ngx.say(json_text)





リクエストの内容解析は過去の記事が役に立ちました。
nginx 1.6.2 + lua-nginx-moduleで簡易ファイルアップローダー


リクエストを送信するPython側のサンプル


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. data = json.dumps({u'value':u'日本語'})
  5. f = urllib2.urlopen('http://192.168.1.104/', data)
  6. json_text = f.read()
  7. json_data = json.loads(json_text)
  8. print json_data['value']




実行結果


$ python sample.py
取得したvalue:日本語




日本語も問題なく処理できていますね。


【参考URL】

https://www.kyne.com.au/~mark/software/lua-cjson-manual.html
nginxで静的jsonファイル配信時に日本語が文字化けしないようにする

関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ