json-serverを使って爆速でモックサーバーを作成する
背景
負荷試験の勉強をしていて,負荷試験ツールLocustを使ってみるか〜と思いきや,負荷をかけるサーバーをまず作成する必要がありました.
(負荷試験に使えるのかは知らないけれど)手軽にREST APIのモックサーバーを作成できるjson-serverというものを使ってみました.
(後述にある通り少しハマりましたが)READMEに
Get a full fake REST API with zero coding in less than 30 seconds (seriously)
とあるようにサクッとモックサーバーを作れました
環境
OS : MacOS(intel)
npm version : 8.5.5
node version : v16.15.0(nodebrewでインストール)
インストール
公式にある通りやっていきます
$ npm install -g json-server
db.jsonというファイルを作成して,以下のように編集します.
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
起動
起動は1コマンドで完了です.
$ json-server --watch db.json
\{^_^}/ hi!
Loading db.json
Done
Resources
http://localhost:3000/posts
http://localhost:3000/comments
http://localhost:3000/profile
Home
http://localhost:3000
Type s + enter at any time to create a snapshot of the database
Watching...
※ポート番号を3000以外に変更したい場合は json-server --watch db.json --port 3004
のように --port
で指定します.
ブラウザで http://localhost:3000/ にアクセスすると次のようなページが表示されます.
db.jsonで設定したエンドポイントへのアクセスはブラウザでURLを開くかcurlコマンドでも可能です.
$ curl http://localhost:3000/posts/1
{
"id": 1,
"title": "json-server",
"author": "typicode"
}
$ curl http://localhost:3000/comments/1
{
"id": 1,
"body": "some comment",
"postId": 1
}
$ curl http://localhost:3000/profile
{
"name": "typicode"
}
db.jsonを変更してみる
postsにid=2を追記してみます.
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" },
{ "id": 2, "title": "new title", "author": "lightkun" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
REST APIなので,エンドポイント/posts/
の後ろにidを指定しない場合はpostsというリソース全てを返してくれます.凄い
$ curl http://localhost:3000/posts
[
{
"id": 1,
"title": "json-server",
"author": "typicode"
},
{
"id": 2,
"title": "new title",
"author": "lightkun"
}
]
POST, PUTメソッドで実行してみる
json-serverではGETメソッド以外も実行可能ですが,POSTやPUTをするとリソースも変更してしまうようです.
まずはPOSTメソッドで実行してみます.
$ curl -XPOST http://localhost:3000/posts -d '{"title": "new title 2022.05.17", "author": "lightkun@v2"}' -H "Content-Type: application/json
{
"title": "new title 2022.05.17",
"author": "lightkun@v2",
"id": 3
}
実行後にdb.jsonをみるとid=3の新規リソースが作成されていることが分かります.
PUTメソッドで作成したid=3を更新してみます.
$ curl -XPUT http://localhost:3000/posts/3 -d '{"title": "change by put method 2022.05.17", "author": "lightkun@v3"}' -H "Content-Type: application/json"
{
"title": "change by put method 2022.05.17",
"author": "lightkun@v3",
"id": 3
}
実行後にdb.jsonをみるとid=3の新規リソースが変更されていることが分かります.
POSTやPUTメソッドが実行できるのは嬉しいですが,リソースは変更しないようにしたい場合もあります(どちらかというと変更したくない用途のほうが多い気はする).
試してはいないですが,以下の記事のようにミドルウェアを使って,GET以外のメソッドもGETメソッドに置き換える処理を入れると実現可能なようです.
ハマったこと
自分の環境でしか発生しないかもしれませんが, http://localhost:3000/ へアクセスしてもエラーになりました.原因は単純にポート番号3000でdockerコンテナを起動していたためです.
ポート番号を何に使っているかは
$ lsof -i:3000
で確認可能です.
という感じでjson-serverを起動したときにAlready Usedなどのエラーが出なかったので,少しハマってしまいました.
Discussion