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

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
24
Help us understand the problem. What is going on with this article?
@murachi1208

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

More than 5 years have passed since last update.

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

24
Help us understand the problem. What is going on with this article?
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
murachi1208
社内では「お手伝い、この!はげ!(スキンヘッドですYO)」と呼ばれてるしがないオッサンエンジニア。調べたことをこつこつ投稿しています。 ※内容は個人的趣味範囲であり所属組織とは関係ありません。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
24
Help us understand the problem. What is going on with this article?