ネットワークエンジニアのアレ

技術情報メインの備忘系ブログです

www.flickr.com

簡単・軽量・柔軟なモックサーバ を作る(gostub)

f:id:naitwo2:20190310021018p:plain

モックサーバ

「バックエンドが完成していなくて(API完成していない)、フロント側の開発・テストが進まない。」 よくある話だと思います。
そんな場合は、任意のレスポンスを静的に返すモックサーバを用意することがよくある解決策だと思います。

自分もモックサーバが必要になり、 ”gostub”というGolangのモックサーバライブラリを見つけました。
調べて使ってみると、要件にかなりマッチしていたので紹介します。

@moaible(もあいぶる🗿(@moaible)さん | Twitter)さん作。

github.com

求めていた要件

求めていた要件はこんな感じ。

  • 環境構築が簡単なこと(簡単)
  • 設定も簡単なこと(簡単)
  • 軽量であること(軽量)
  • ある程度細かなハンドリングを行えること(柔軟)
    • headerの内容に応じてレスポンスを変える等

環境構築

環境構築 手順です。
とても簡単なので、GitHubのREADME見れば分かると思いますが念のため書いておきます。

*Golangのインストール、GOPATHなどのGolangの環境構築手順は省略します。
 「Golang 環境構築」のようなキーワードでGoogle検索すると、わかりやすい記事がたくさん出てきます

Golangの環境構築完了後に、以下のコマンドを実行します。

go get github.com/gostub/gostub

GOPATHで指定されているPATHにダウンロードされます。

基本的な使い方

使い方も簡単&シンプルです。

設定

リクエストに対して、どのようなレスポンスを返すのかをJSONで定義します。

${HTTPメソッド}.jsonファイルを作成し、routing定義を行います。
GETの場合は$GET.jsonです。
* POSTの場合は$POST.json、PUTの場合は$PUT.jsonというファイル名にします
*ファイル名先頭に$を入れるので、コマンドを実行する際は先頭にバックスラッシュを入れる必要があります(例:vi \$GET.json)

モックサーバ上のディレクトリ構成がそのままURLのパスになります。

モックサーバ イメージ
イメージ

以下のディレクトリ構成の場合、GET /mock/testをリクエストすると、test/ディレクトリ配下の$GET.jsonの内容でroutingされます。
default.jsonがレスポンス内容を定義するファイルです。

.
 └ mock/
    └ test/
       └ $GET.json
        └ default.json

mock/test/$GET.json

{
  "default" : {
    "body": "default.json",
    "status": 200
  }
}

mock/test/default.json

{ "msg": "Hello, World!" }

起動

gostub -p {ポート番号} -o {gostubのルートディレクトリ}

-p
待ち受けるポート番号を指定します。 デフォルトは8181。
-o
モックサーバ (gostub)のルートディレクトリを指定します。
ディレクトリ構成が/home/testuser/mock/testで、mock/をルートディレクトリにする場合は、gostub -o /home/testuser/mock/と指定します。

*同時に複数ポートで待ち受けることはできないので、待ち受ける場合はgostubを複数起動します

レスポンス

gostub -p 8888で起動しcurl localhost:8888を実行すると、以下のレスポンスが返ってきます。

{ "msg": "Hello, World!" }

もう少し踏み込んだ使い方

ここからはもう少し踏み込んだ使い方の説明です。

クエリーの内容に応じてレスポンスを変更する

クエリーの内容が以下の場合に、{ "msg": "Cat is cute!" }を応答する設定をします。 curl localhost:8888/mock/test?type=cat&age=5

type = cat
かつ
age = 5

設定内容は以下。 handlers配下のparamに条件を指定します。

$GET.json

{
  "default": {
    "body": "default.json",
    "status": 200
  },
  "handlers" : [
    {
        "content": {
            "body": "response_cat.json",
            "status": 200
        },
        "param": {
            "type"      : "cat",
            "age"       : "5"
        }
    }
  ]
}

response_cat.json

{ "msg": "Cat is cute!" }

条件にマッチしない場合は、"default": {の内容が実行されます。

.
 └ mock/
    └ test/
       └ $GET.jsondefault.json
        └ response_cat.json


豆知識
上記設定の場合は、age = 500でも{ "msg": "Cat is cute!" }を応答してしまうため、完全一致(age = 5)の場合にのみ応答させる場合は正規表現を使います。

 "param": {
            "type"      : "cat",
            "age"       : "5$"
        }

ハンドリングに利用できるパラメータ種別は、クエリー、ヘッダー、パスです。

おわりに

サクッと、それなりに柔軟性のあるモックサーバ を作れるgostubはかなりオススメです。
モックサーバ をこれから作られる方は選択肢の1つにぜひ。

github.com

tech.jxpress.net