search
LoginSignup
25
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

よくあること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解析パッケージ

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
What you can do with signing up
25
Help us understand the problem. What are the problem?