任意のリクエストヘッダを条件にできるスタブAPIサーバーが見つけられなかったので作ってみました。
名前はスタボンと付けました。
できること
- 特定のリクエストにマッチした場合に、指定の固定値を返す
- 下記を条件にすることができる
- リクエストパス(ルーティングパラメーターも含む)
 - リクエストメソッド
 - リクエストパラメーター
 - リクエストヘッダー
 
 - 下記を固定値として返却できる
- http ステータスコード
 - レスポンスボディ(json)
 
 - 上記を設定するファイルとして2つのフォーマットが使える
- YAML(.yml)
 - JSON(.json)
 
 
 - 下記を条件にすることができる
 
インストール
$ npm i -D stubon
設定ファイルの書き方
YAMLかJSONで書きます。
読み込まれた順にチェックされ、マッチした時点でチェックを終了、そこに指定されているresponseが返されます。「設定されたリクエスト条件 ⊆ 実際のリクエスト」が成り立てばマッチとなりますので、余分なリクエストがあっても大丈夫です。マッチしない場合は404です。
# data.yml
'/aaa/get/{id}': # リクエストパス毎に配列で条件を指定。{}でルーティングパラメータになる。
    -
        request:
            method: 'GET' # 'POST', 'PUT'などを入れる。任意。
            params:       # ルーティングパラメーターをオブジェクトで指定。任意。
                id: '999'
            queries:      # リクエストパラメーターを指定。任意。
                a: 'b'
            headers:      # リクエストヘッダーを指定。これが欲しかった。任意。
                x-hoge: 'hoge'
        response:
            status: 200   # httpステータスコード
            body:         # レスポンスボディ
                result: 'OK!!!'
    -
        request:
            method: 'GET'
        response:
            status: 500
            body: 'error'
上記の場合は「'/aaa/get/999?a=b'」にヘッダー「x-hoge: hoge」を乗せてGETでリクエストすると、「'{ result: "OK!!!" }'」が200で返されます。
そして、それ以外のGETリクエストは「'error'」が500で返され、
さらに、GET以外は404、といった具合です。
例のように条件の狭いものから順に書くと良い感じで使えます。
サーバーの立て方
コマンドラインからもスクリプトからも立てられます。
$ npx stubon -s ./dev/src -p 8080 --ssl --debug
# -s      設定ファイルを置いてあるディレクトリ。必須です。
# -p      サーバーのポート。必須です。
# --ssl   オレオレ証明ですがsslでサーバーを立てます。任意です。
# --debug リクエストマッチの様子をログに出します。思うようにマッチしない場合は見てみてください。任意です。
同じものをgulpで立てる場合はこんな感じです。
// gulpfile.babel.js
import gulp   from 'gulp';
import Stubon from 'stubon';
gulp.task('stubon', () => {
    const options = {
        debug : true,
        ssl   : true,
    };
    const stubon = new Stubon('./dev/src', options);
    return stubon.server().listen(8080);
});
使いどころ
つなぐ予定のAPIがまだできていない、
APIを呼びすぎると怒られるので開発中はスタブにしたい、
特定のレスポンスが欲しいけどAPI開発者にデータを作ってもらうのが面倒だ、
などなど、主に開発環境でお使いいただければと思っております。
最後に
初めての公開で右も左もわからない状態でございます。
ご意見ご感想などいただけますと幸いです。