背景
APIを使ったシステムを作るのに接続先APIがまだない場合に、簡単にAPIのスタブサーバを立ち上げたい。
mockyという便利なものを使わせていただく。
mockyとは
Node.jsベースでできたモックサーバ。
okv/mocky : https://github.com/okv/mocky
環境
Mac
Docker
docker-compose
説明しないこと
Dockerやdocker-composeのインストールや操作方法
Node.js の使い方
やりたいこと
特定のURLにアクセスされたら、特定のjsonデータを出力させる。
jsonデータは、ファイルで用意してそれを読み込んで出力させる。
リクエストデータもjson形式で、POSTで受ける。
手順
構成
current
|
+- docker-compose.yml
|
+- mocky
| |
| +- Dockerfile
|
+- stub
| |
| +- mocky.js
| +- user-100.json
| +- user-101.json
| +- user-102.json
| +- user-list.json
mockyのコンテナimageを定義する
Dockerfile
FROM node:latest
RUN npm install mocky
今回はこれを docker-composeから実行して作るが、これだけ動かしてもOK
mockyを扱いやすいように docker-composeで起動方法を定義する
version: '2.2'
services:
mocksan:
build: ./mocky
container_name: mocksan
volumes:
- "./stub:/node"
ports:
- "3000:3000"
entrypoint: node /node/mocky.js
モックしたいURLを定義する
var mocky = require('mocky');
var fs = require('fs');
mocky.createServer([
{
// ユーザ情報
url: '/api/v01/user/get',
method: 'post',
res: function(req, res, callback) {
var params = JSON.parse(req.body); // 受け取ったjsonデータを参照する場合
var f = '/node/user-' + params.userid + '.json'; // パラメタ別のjsonファイル
fs.readFile(f, 'utf8', function(err, text) {
callback(null, {
status: 200,
body: text
});
});
}
},
{
// ユーザリスト
url: '/api/v01/user/list',
method: 'post',
res: function(req, res, callback) {
fs.readFile('/node/user-list.json', 'utf8', function(err, text) {
callback(null, {
status: 200,
body: text
});
});
}
}
]).listen(3000);
起動
$ docker-compose up -d
テスト
ホストマシンからは、localhost
でアクセスできる。
別のDockerコンテナ内からの場合は、mocksan
でアクセスできる。
curlコマンドで動かしてみる。
$ curl -X POST http://localhost:3000/api/v01/user/get -d '{"userid":"100"}'
{
"userid": "100",
"username": "hanako-san"
}
ログ
docker のログ出力機能でmockyへのアクセスを見ることができる。
console.log などで出力した場合もここに出る。
$ docker logs mocksan -f
[mocksrv] [req 0] [Thu, 07 Dec 2017 06:21:30 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"100"}
[mocksrv] [req 1] [Thu, 07 Dec 2017 06:21:40 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"101"}
[mocksrv] [req 2] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"102"}
[mocksrv] [req 3] [Thu, 07 Dec 2017 06:24:49 GMT] method: POST url: /api/v01/user/list req.body: {"userid":"103"}
注意
mocky.js を変更した場合は、nodeまたは、コンテナの再起動が必要。
感想
とても便利。