PythonでJSONを返す簡易モックサーバーの構築

フロントエンド開発やAPI連携のテストにおいて、バックエンドAPIがまだ準備できていない場合や、特定のレスポンスをシミュレートしたい場合に、モックサーバーが非常に役立ちます。ここでは、Pythonの標準ライブラリ wsgiref を用いて、JSONデータを返す簡易的なモックサーバーを構築する方法を紹介します。

WSGI (Web Server Gateway Interface) を用いてWebサーバーを起動する

wsgiref.simple_server は、PythonのWebアプリケーションとWebサーバー間の標準インターフェースであるWSGIのリファレンス実装です。これを利用して、シンプルなHTTPサーバーを構築できます。

from wsgiref.simple_server import make_server
import json

# サーバーがリッスンするポート番号
PORT = 8081

# モックデータの定義
# PATH_INFO (リクエストパス) に応じて返すJSONデータを設定
MOCK_DATA_SETTINGS = [
    {
        "PATH": "/api/1",
        "VALUE": {
            "items": [
                {"item1": "test1"},
                {"item2": "test2"}
            ]
        }
    },
    {
        "PATH": "/api/2",
        "VALUE": {
            "items2": [
                {"itemA": "testA"},
                {"itemB": "testB"}
            ]
        }
    }
]

def application(environ, start_response):
    """
    WSGIアプリケーションのエントリポイント。
    リクエストに応じて適切なJSONデータを返す。
    """
    path = environ.get("PATH_INFO", "/") # リクエストパスを取得

    for setting in MOCK_DATA_SETTINGS:
        # リクエストパスが設定されたパスで始まるかチェック
        if path.startswith(setting["PATH"]):
            status = '200 OK' # HTTPステータスコード
            headers = [
                ('Content-type', 'application/json; charset=utf-8'), # JSON形式であることを指定
                ('Access-Control-Allow-Origin', '*'), # CORS対応 (全てのオリジンからのアクセスを許可)
            ]
            start_response(status, headers) # レスポンスヘッダーを送信

            # JSONデータをUTF-8でエンコードして返す
            return [json.dumps(setting["VALUE"]).encode("utf-8")]
    
    # どのパスにもマッチしない場合
    status = '404 Not Found'
    headers = [('Content-type', 'text/plain; charset=utf-8')]
    start_response(status, headers)
    return [b"404 Not Found"]

if __name__ == "__main__":
    # サーバーを起動
    # make_server(ホスト名, ポート番号, WSGIアプリケーション)
    httpd = make_server('', PORT, application)
    print(f"Serving on port {PORT}...")
    print("Access URLs like: http://localhost:8081/api/1")
    print("Press Ctrl+C to quit.")
    httpd.serve_forever()

コードの解説

  • make_server('', PORT, application):
    • '': ホスト名を指定しない場合、すべての利用可能なインターフェースからの接続を受け入れます(0.0.0.0 と同等)。
    • PORT: サーバーがリッスンするポート番号です。
    • application: WSGIアプリケーションオブジェクトです。HTTPリクエストが来るたびにこの関数が呼び出されます。
  • environ: 環境変数を含む辞書で、HTTPリクエストに関する情報(パス、ヘッダーなど)が含まれます。PATH_INFO はリクエストのパス部分です。
  • start_response(status, headers): レスポンスのステータスコードとヘッダーを設定するための関数です。
  • json.dumps(data).encode("utf-8"): Pythonの辞書をJSON文字列に変換し、さらにバイト列にエンコードしています。WSGIアプリケーションはバイト列を返す必要があります。
  • Access-Control-Allow-Origin: *: これはCORS(Cross-Origin Resource Sharing)に対応するためのヘッダーです。異なるオリジン(ドメイン、プロトコル、ポート)からのJavaScriptリクエストを許可するために必要です。開発時には * で全てを許可することが多いですが、本番環境では特定のオリジンに制限することが推奨されます。

このスクリプトを実行すると、指定したポートでWebサーバーが起動し、/api/1/api/2 などのパスにアクセスすると、対応するJSONデータが返されます。

参考