45
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

スタブAPIサーバ

Single Page Application のスタイルでアプリケーションを作ろうとしていると、HTML + JS でいろいろと作っていくわけですが、当然通信先のAPIサーバが必要になります。で、下記などで紹介されているように、とりあえず それっぽいレスポンスを返してくれる API サーバを作ったりするわけです。

上記を参考に、easymock とか stubby とかをちょっと試してみたんですが、インストールで はまりどころがあったりして、誰にでもお勧め出来る感じではなかったのと、好みのエラーを起こせないというところが「もう一声..」という印象を受けました。

ってなわけで、ぐぐってみたところ、下記の mocky というものを見つけました。

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

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

インストール

って、わざわざ章立てするほどのこともなかったです。
下記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 あたりで確認してみましょう。

任意のファイルをレスポンスに利用する

それなりに大きいレスポンスボディを返そうと思ったら、別ファイルで管理するほうがラクですよね。そういう場合も、mocky でカンタンに対応出来ます。

response_data/users.json というデータファイルを用意します。

response_data/users.json
[
  {
    'id': 1,
    'name': 'John',
    'mail': 'john@example.com'
  },
  {
    'id': 2,
    'name': 'Mary',
    'mail': 'mary@example.com'
  }
]
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もどきを用意することが出来そうです。

45
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?