Node.js の mocky を使用し スタブREST API を作成してみる、その１

# よくあることｗ
システム開発をしていると大小に関係なく画面作成担当、REST API担当と作業分担をすると思いますが、その時に困るのが画面作成担当になったときなんですよね。何故かっていうと並列でスケジュールを切られていることが殆どで、まあ「REST API担当者」は、仕様が決まらないから作れないーって遅れても言い訳がつく、、画面作成担当は着手できないそするとどんどん画面作成が遅れる…っておっと。愚痴っぽくなってきました（笑）

とまあ、そんなありがちなときに、どうするかっていうとAPI設計書を見ながら、[モック（スタブ）](http://d.hatena.ne.jp/devbankh/201002)REST API を作るわけなんですよねphp で作ったりperl で作ったりと。そして毎回少し面倒だったりするわけですよ。
で、今回の mocky 、なかなか簡単にできるのでいいかもって思ってますｗ

# Node.js のインストール
EPELリポジトリからインストールします。今回、特にバージョンのこだわりないので最新版をいれます。

```
$ sudo yum install epel-release
$ sudo yum install nodejs npm
$ node -v
v0.10.33
```

# mocky のインストール
[mocky を使ってちょっと賢いスタブAPIサーバを作る](http://qiita.com/kz_takatsu/items/9736dac0f8d96c343fd6) こちらの記事を見て easymock とか stubby を見てみましたが、記事元の方と同じように「いまいち感」が同じでしたｗ。ですので mocky をインストールします。

okv/mocky : https://github.com/okv/mocky

インストール超簡単ｗ

```
$ npm install -D mocky
```

# サンプルを実行してみる
mocky ページにある Exsample をコピペなどして mock.js を作成します。あとは、立ち上げるだけｗ

```
$ 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っぽく作ってみます。よくあるあるっていう処理を組み込んでみましたが、処理を書けば書くほどに実アプリっぽくなるのでまあ、落としどころが難しいですが簡単に作れるのがいいですわ。

```javascript:mocky_sample4.js
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:response_data/users.xml
<?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 が使えないこと（ソースみていると考慮されているので、使い方をまた模索してみます）、１ファイルで記述するのでファイルが巨大化するのは仕方ないかな？ぐらいです。
まあなにせよ、物がJavaScript なので意外と簡単に作れますね。Node.js は、Windows版でもさっくり入るし結構、これはいい感じかも。

httpsで動かせてみたｗ 
[Node.js の mocky を オレオレhttps で動かしてみる、その２](http://qiita.com/murachi1208/items/60d765d386aea431af3a)

# その他
> [node.jsのrequireを使ってみた！](http://akiyoshi220.blogspot.jp/2010/10/nodejsrequire.html)
> [Node.jsでのBase64エンコード＆デコード＋おまけ](http://shoboshobopg.hatenablog.com/entry/2015/02/09/190510)
> [xml2js - node.js xml解析パッケージ](http://nodejs.osser.jp/node/node-xml-js/)