mocky を使ってちょっと賢いスタブAPIサーバを作る


スタブ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 というものを見つけました。

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

ドキュメントがほとんどないのが難点なんですが、これを使って、ちょっと工夫すると、わりと自由に　それっぽい APIサーバを作ることができたので、ご紹介。

ちなみに、mocky よりも、下記の Mocky のほうが有名かと思いますが、全然別モノです。

* Mocky https://github.com/studiodev/Mocky
* Mocky.io http://www.mocky.io/


インストール
---------

って、わざわざ章立てするほどのこともなかったです。
下記URLのとおり npm install してください。私は何もはまらず、さくっと動きました。

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

```bash:
$ 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 とか作って起動してください。私は何もはまらず、さくっと動きました。

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

とりあえず、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 というデータファイルを用意します。

```javascript:response_data/users.json
[
  {
    'id': 1,
    'name': 'John',
    'mail': 'john@example.com'
  },
  {
    'id': 2,
    'name': 'Mary',
    'mail': 'mary@example.com'
  }
]
```


```javascript:sample_api.js
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もどきを用意することが出来そうです。