Jokk というライブラリを作った
年始に [twitter:@bathtimefish] さんと [twitter:@kadoppe] さんと食事しながら色々話しをした時に、EasyMock という Node.js のプロダクトが良いという話しを聞いた。
https://github.com/cyberagent-jp/node-easymock
これは何かというと、フロントエンドの開発者とサーバ側の開発者が別の場合、サーバ側がまだ出来てないけど、フロントエンド側がサーバ側から HTTP 経由でデータを欲しい場合がある。
その時にとりあえずダミーで良いからモックデータを返して欲しいという要望があるとする。
いちいちマイクロフレームワークでサーバ立ててとかするんだろうけど、それを簡単にしてくれるという物。
URI のリソースと json ファイルが一対一でマッピングされており、URI にアクセスすると該当の JSON ファイルの中身を応答するという物。
Node.js で作られている。
Web APIの開発に使えるモックサーバ·EasyMock Server MOONGIFT
便利そうだったので見てみたが、ドキュメントが最低限の事しか書かれてないし、config.json や 配信する json ファイルを格納する所を任意に指定とかできなさそう、応答するステータスコードの指定が出来なさそう等色々出てきたので、似たようなものを Python で実装した。
GitHub - heavenshell/py-jokk: RESTful mock api server.
本体に Pull Request せずに Python で似たようなのを作ったのは、Node.js が良くわからなかったからというのが大きい。
使い方
PyPi に登録したので、pip でインストールできる。
$ mkvirtualenv jokk_sample $ mkdir jokk_sample $ cd jokk_sample $ pip install jokk
これで jokk コマンドが使用できる。
Werkzeug を使ってるので必須。
また Werkzeug が現状 Python3 に対応してないので、必然的に Python2.7 までしか動かない。
# Python2.6 も tox のテストで通ってるから多分動く
# Python2.5 以下は未対応
{ "data": "./data", "cors": false, "jsonp": true, "variables": { "server": "http://server.com" }, "routes": [ "/", "/user/<userid>", "/user/<userid>/profile", "/item" ] }
こんな感じで config.json を作る。
データ格納場所
data がクライアントに応答するファイルを格納する。
クロスドメイン
cors を true にすると Cross-Origin Resource Sharing が有効になる。
jsonp を true にすると jsonp の応答(callback が先頭に追加する)する。
テンプレート変数
variables に値を定義するとその値が応答するファイル内でテンプレートとして動的に追加できる。
また routes で定義した
ルーティング
routes にルーティングを定義する。
Werkzeug のルーティングの書き方をする。
ファイルには以下のような命名規則がある。
ルーティングのパス + '_' + HTTP Method + .{json,xml,html,txt}
ルーティング | ファイルパス |
---|---|
/ | ./data/_get.json |
/user/ |
./data/user/userid_get.json |
/user/ |
./data/user/userid/profile_get.json |
/item | ./data/item_get.json |
レスポンス用のファイル名と同じ形式で .status ファイルを作成し、中身に応答したい HTTP ステータスコードを書くと、それが設定される。
/item | ./data/item_post.status |
中身が
201
だとすると、レスポンスのステータスコードに 201 が設定される。
ここが EasyMock との一番の違い。
EasyMock は HTTP のステータスコードまで考慮してないっぽい。
RESTful なサーバの場合は HTTP ステータスコードを見てどうこうというのがあると思うので、そこら辺も押さえておきたかった。
起動方法
$ jokk -c config.json * Running on http://127.0.0.1:5000/
設定ファイルを指定して起動をし、ブラウザやその他クライアントでアクセスすると、レスポンスファイルが拡張子に応じた mimetype で応答する。
Jokk ってなんて読むの?
Jokk の元ネタはヨックモック(YokuMoku)でヨックモックはスウェーデンの JokkMokk から取ってるそうなので、ヨックと読む。