[Python] TornadoでJSON APIを作成する

概要

JSONでリクエストして、レスポンスをJSONで返すAPIをTornadoで作成します。

環境

Python3.9 で tornado v6.1で動作確認しています。

実装

JSONをPOSTできるAPIを実装します。

import json
import logging

import tornado.ioloop
import tornado.web

logging.basicConfig(
    format='%(asctime)-15s %(levelname)s %(message)s',
    level=logging.INFO)


class JsonHandler(tornado.web.RequestHandler):
    async def post(self):
        # JSON以外のリクエストは400 Bad Requestにする
        if (self.request.headers.get('Content-Type')
                != 'application/json'):
            raise tornado.web.HTTPError(400)

        # JSONをパースする
        data = json.loads(self.request.body)

        # ここで処理を実施する
        logging.info(f'data = {data}')

        # レスポンスを書き込む
        self.write({'result': 'OK'})


def main():
    app = tornado.web.Application([
        (r'/json', JsonHandler),
    ])
    app.listen(8080)
    tornado.ioloop.IOLoop.current().start()


if __name__ == '__main__':
    main()

動作確認

まずはサーバを起動します。

# 仮想環境を作成
$ python3.9 -m venv test_env
$ source test_env/bin/activate
$ pip install tornado
Collecting tornado
  Using cached tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl (416 kB)
Installing collected packages: tornado
Successfully installed tornado-6.1

# サーバ起動
$ python jsonserver.py

別のウインドウを開いてリクエストを投げてみます。

$ curl -v localhost:8080/json -H 'Content-Type: application/json' -d '{
  "data": {
    "date": "2021-04-18"
  }
}'
* Trying ::1…
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0) 
> POST /json HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.1
> Accept: /
> Content-Type: application/json
> Content-Length: 44
*   upload completely sent off: 44 out of 44 bytes
< HTTP/1.1 200 OK
< Server: TornadoServer/6.1
< Content-Type: application/json; charset=UTF-8
< Date: Sun, 18 Apr 2021 10:38:03 GMT
< Content-Length: 16
<
* Connection #0 to host localhost left intact
{"result": "OK"}* Closing connection 0    
ログの確認

「[Python] TornadoでJSON APIを作成する」への1件のフィードバック

コメントする