フロントエンド開発や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データが返されます。