📝

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

2021/04/10に公開

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

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

httpsで動かせてみたw
Node.js の mocky を オレオレhttps で動かしてみる、その2

その他

node.jsのrequireを使ってみた!
Node.jsでのBase64エンコード&デコード+おまけ
xml2js - node.js xml解析パッケージ

GitHubで編集を提案

Discussion