JSON Server
JSON Server(https://github.com/typicode/json-server)はREST APIテストサーバー。
すぐに立ち上げることが出来て、簡単にクライアント側のREST APIの試験ができる。
1. インストール
$ sudo yum install -y nodejs
$ sudo npm install -g json-server
2. データファイル作成
db.jsonというファイルを作り、エンドポイントと返却するJSONデータを書き込む。
(名称はdb.jsonでもほげでも何でも良い)
$ vi db.json
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" },
"movies":
[
{"id": 1, "name": "The Godfather", "director":"Francis Ford Coppola", "rating": 9.1},
{"id": 2, "name": "Casablanca", "director":"Michael Curtiz", "rating": 8.8},
]
}
データファイルは正しいJSONのフォーマットでないとすぐ以下のようなエラーが出る。 (例えば最後にカンマをつけるとエラーになったり)
SyntaxError: Malformed JSON in file: db.json
このエラーが出た場合はJSONデータがおかしいので修正すること。
3. 起動
3-1. 起動
json-serverコマンドで起動する。
オプション
-p: ポート番号
-w: JSONファイル名
$ json-server -p 9999 -w db.json
3-2. 動作確認
ブラウザで、 http://localhost:9999/posts にアクセスし、期待通りのJSONデータが戻ってくることを確認する。
[
{
"id": 1,
"title": "json-server",
"author": "typicode"
}
]
4. 絞り込み検索
エンドポイントを指定しても全データが欲しい訳じゃない。
ので、必要なデータをフィルタリングする方法を述べる。
4-1. 値によるフィルター
キーの中でも、 "id" という文字列には特別な意味があり、
http://localhost:9999/movies/1
とるすと、"id":1のデータだけ取ってくる。
"id" 以外の場合、例えば "name" の場合は、
http://localhost:9999/movies?name=The Godfather
の用に、 ? の後ろに キー=値 としなければならない。
要は"id"だけ、
http://localhost:9999/movies?id=1
http://localhost:9999/movies/1
もちろんキーは多重がけできる。この場合、andになる。
http://localhost:9999/movies?id=2&name=Casablanca
4-2. 大なり小なりによるフィルター
一定の値より大きい値、とかで絞り込みたい場合もある。
その場合はキーの後ろに_gte(大なり)、_lte(小なり)、_ne(否定)をつけると絞り込める。
viewsが10以上20以下の値だけ取りたい場合は以下の用にする。
http://localhost:9999/posts?views_gte=10&views_lte=20
否定も同じような感じ。
http://localhost:9999/posts?id_ne=1
5. ページ単位での取得。
JSON Serverはページ単位でデータを取得することが出来る。
ただし、この機能は本当に暫定で、1ページ10件固定となっている。
_pageの後ろの数字を入れるとそのページに該当するデータだけを返却する。
3だった場合、21件目から30件目までが返却される。
http://localhost:9999/movies?_page=3
6. ソート
ソートも出来るよ(デフォルト昇順、_orderにDESCをつけると降順)
http://localhost:9999/movies?_sort=name&_order=DESC
7. 普通のWebサーバとして使う
JSON Serverは実は普通のサーバーとしても使える。
(使わないと思うが)
publicというディレクトリ配下にあるhtmlをそのまま読むだけ。
mkdir public
echo 'hello world' > public/index.html
json-server -p 9999 -w db.json
これで http://localhost:9999/index.html にアクセスすると、 hello world が返却される。
8. エンドポイントの階層対応
例えば、
http://localhost:9999/posts
というエンドポイントを
http://localhost:9999/api/posts
にしたい場合、残念ながらJSON Serverは対応していない。
/ aren't supported, if you want to tweak default routes, see
でも、普通は本番用のAPIのパスは上記みたいに/apiとか一個かましているもの。
単体試験と結合でREST APIのエンドポイントを変えるのは流石にしんどい。
ので、以下の用に強制的にエンドポイントに/api/を付加させる。
vi routes.json
{
"/api/*": "/$1"
}
起動時にオプション -r に routes.json を指定
$ json-server -p 9999 -w db.json -r routes.json
これで
http://localhost:9999/api/movies
でアクセスできる
ただし、気を付けないといけないのは、 http://localhost:9999/movies が無効になったわけではない点。
両方にアクセスできるようになっただけ。
簡易サーバにあまり過度な期待をすべきでないので、この程度とする。