コンテンツにスキップ

Top

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 が無効になったわけではない点。

両方にアクセスできるようになっただけ。

簡易サーバにあまり過度な期待をすべきでないので、この程度とする。