Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
44
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

スタブ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もどきを用意することが出来そうです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
44
Help us understand the problem. What are the problem?