スタブAPIサーバ
Single Page Application のスタイルでアプリケーションを作ろうとしていると、HTML + JS でいろいろと作っていくわけですが、当然通信先のAPIサーバが必要になります。で、下記などで紹介されているように、とりあえず それっぽいレスポンスを返してくれる API サーバを作ったりするわけです。
- Single-page Application(SPA)でeasymock or stubbyを使ってJSON簡単開発
http://albatrosary.hateblo.jp/entry/2014/02/06/155004
上記を参考に、easymock とか stubby とかをちょっと試してみたんですが、インストールで はまりどころがあったりして、誰にでもお勧め出来る感じではなかったのと、好みのエラーを起こせないというところが「もう一声..」という印象を受けました。
ってなわけで、ぐぐってみたところ、下記の mocky というものを見つけました。
ドキュメントがほとんどないのが難点なんですが、これを使って、ちょっと工夫すると、わりと自由に それっぽい APIサーバを作ることができたので、ご紹介。
ちなみに、mocky よりも、下記の Mocky のほうが有名かと思いますが、全然別モノです。
- Mocky https://github.com/studiodev/Mocky
- Mocky.io http://www.mocky.io/
インストール
って、わざわざ章立てするほどのこともなかったです。
下記URLのとおり npm install してください。私は何もはまらず、さくっと動きました。
$ nvm use v0.10.26
Now using node v0.10.26
$ npm install -D mocky
npm http GET https://registry.npmjs.org/mocky
npm http 200 https://registry.npmjs.org/mocky
npm http GET https://registry.npmjs.org/mocky/-/mocky-0.1.8.tgz
npm http 200 https://registry.npmjs.org/mocky/-/mocky-0.1.8.tgz
mocky@0.1.8 node_modules/mocky
シンプルな使い方
って、わざわざ章立てするほどのこともなかったです。
下記URLのサンプルのとおり mock.js とか作って起動してください。私は何もはまらず、さくっと動きました。
とりあえず、Firefox なら Poster、Chrome なら Postman あたりで確認してみましょう。
- Poster for Firefox https://addons.mozilla.org/ja/firefox/addon/poster/
- Postman for Chrome https://chrome.google.com/webstore/detail/postman-rest-client/fdmmgilgnpjigdojojpjoooidkmcomcm
任意のファイルをレスポンスに利用する
それなりに大きいレスポンスボディを返そうと思ったら、別ファイルで管理するほうがラクですよね。そういう場合も、mocky でカンタンに対応出来ます。
response_data/users.json というデータファイルを用意します。
[
{
'id': 1,
'name': 'John',
'mail': 'john@example.com'
},
{
'id': 2,
'name': 'Mary',
'mail': 'mary@example.com'
}
]
var mocky = require('mocky');
var fs = require('fs');
var ctpath = '/api';
mocky.createServer([{
// Users
url: ctpath+'/users',
method: 'get',
res: function(req, res, callback) {
fs.readFile('./response_data/users.json', 'utf8', function(err, text) {
callback(null, {
status: 200,
body: text
});
});
}
}
]).listen(4321);
で、上記のような レスポンスを定義する sample_api.js を作った後、下記のように起動すればOK!
$ node sample_api.js
リクエストに応じて処理を変える
上記の例のように、レスポンスを関数で処理できちゃうので、もう何でもありです :-)
// Create User
url: ctpath+'/users',
method: 'post',
res: function(req, res) {
var params = JSON.parse(req.body);
if (params.name && params.mail) {
params.id = Math.floor(Math.random()*1000)+2;
return({
status: 201,
body: JSON.stringify(params)
});
} else {
var err = {
code: 400,
message: 'name and mail are required.'
};
return({
status: 400,
body: JSON.stringify(err)
});
}
}
リクエストに応じて、返すファイルを変えたり、テンプレートみたいなの使って、中身をセットして返すことも出来ますね。
認証チェックとかも…
ヘッダもカンタンにチェックできるので、認証クッキーがついているかどうかも見てみましょう。
こんな感じで Cookie とかもチェック出来ます。
// Protected Area
url: '/restricted/hello',
method: 'get',
res: function(req, res) {
var cookies = req.headers['cookie'];
if (cookies && (cookies['AuthCookie'] === '12345')) {
return({
status: 200,
body: 'Hello, this is protected Area!'
});
}
return({
status: 403,
});
}
まとめ
ここまでプログラムっぽく書いちゃうと、スタブなんだかサーバアプリなんだかわかんなくなりますが、かなりお手軽にそこそこ賢いAPIもどきを用意することが出来そうです。