よくあることw
システム開発をしていると大小に関係なく画面作成担当、REST API担当と作業分担をすると思いますが、その時に困るのが画面作成担当になったときなんですよね。何故かっていうと並列でスケジュールを切られていることが殆どで、まあ「REST API担当者」は、仕様が決まらないから作れないーって遅れても言い訳がつく、、画面作成担当は着手できないそするとどんどん画面作成が遅れる…っておっと。愚痴っぽくなってきました(笑)
とまあ、そんなありがちなときに、どうするかっていうとAPI設計書を見ながら、モック(スタブ)REST API を作るわけなんですよねphp で作ったりperl で作ったりと。そして毎回少し面倒だったりするわけですよ。
で、今回の mocky 、なかなか簡単にできるのでいいかもって思ってますw
Node.js のインストール
EPELリポジトリからインストールします。今回、特にバージョンのこだわりないので最新版をいれます。
$ sudo yum install epel-release
$ sudo yum install nodejs npm
$ node -v
v0.10.33
mocky のインストール
mocky を使ってちょっと賢いスタブAPIサーバを作る こちらの記事を見て easymock とか stubby を見てみましたが、記事元の方と同じように「いまいち感」が同じでしたw。ですので mocky をインストールします。
okv/mocky : https://github.com/okv/mocky
インストール超簡単w
$ npm install -D mocky
サンプルを実行してみる
mocky ページにある Exsample をコピペなどして mock.js を作成します。あとは、立ち上げるだけw
$ node mock.js
curl でアクセスを確認してみる。get, post, put メソッド、任意パラメータ渡し、簡単にできそうですね。
$ curl "http://127.0.0.1:4321/someurl1?a=b&c=d"
$ curl -F "a=b" -F "c=d" http://127.0.0.1:4321/someurl2
$ curl -F "a=b" -F "c=d" http://127.0.0.1:4321/someurl3 -X PUT
$ curl "http://127.0.0.1:4321/someurl4?a=99"
リクエストに応じて処理を変える
業務APIっぽく作ってみます。よくあるあるっていう処理を組み込んでみましたが、処理を書けば書くほどに実アプリっぽくなるのでまあ、落としどころが難しいですが簡単に作れるのがいいですわ。
var mocky = require('mocky');
var fs = require('fs');
var url = require('url');
var querystring = require('querystring');
mocky.createServer([{
// Users
url: /\/someurl5\?a=\d+&b=\d+/,
method: 'get',
res: function(req, res, callback) {
var params = querystring.parse(url.parse(req.url).query);
console.log(params.a);
console.log(params.b);
console.log(params.dd);
console.log(params.xml);
if (params.kj) {
console.log(params.kj);
var decode = new Buffer(params.kj, 'base64').toString();
console.log(decode);
callback(null, {
status: 200,
body: decode
});
}
if (params.xml) {
var tt = fs.readFileSync('./response_data/users.xml', 'utf8');
tt = tt.replace(/co.jp/g, params.dd);
console.log(tt);
callback(null, {
status: 200,
body: tt
});
} else {
var err = {
code: 400,
message: 'name and mail are required.'
};
callback(null, {
status: 400,
body: JSON.stringify(err)
});
}
}
}
]).listen(4321);
<?xml version="1.0" encoding="UTF-8" ?>
<venture>
<company>
<name>ソフトバンク株式会社</name>
<url>http://www.softbank.co.jp/</url>
</company>
<company>
<name>楽天株式会社</name>
<url>http://www.rakuten.co.jp/info/</url>
</company>
</venture>
base64値を渡したとき
curl "http://127.0.0.1:4321/someurl5?a=999&b=777&kj=44Gv44GS56a/44OP44Ky" --verbose
xmlを返却したいとき
curl "http://127.0.0.1:4321/someurl5?a=999&b=777&xml=on&dd=com" --verbose
パラメタエラーのとき
curl "http://127.0.0.1:4321/someurl5?a=999&b=777" --verbose
感想
不満があるとすると https が使えないこと(ソースみていると考慮されているので、使い方をまた模索してみます)、1ファイルで記述するのでファイルが巨大化するのは仕方ないかな?ぐらいです。
まあなにせよ、物がJavaScript なので意外と簡単に作れますね。Node.js は、Windows版でもさっくり入るし結構、これはいい感じかも。
httpsで動かせてみたw
Node.js の mocky を オレオレhttps で動かしてみる、その2
その他
node.jsのrequireを使ってみた!
Node.jsでのBase64エンコード&デコード+おまけ
xml2js - node.js xml解析パッケージ