i-Vinci TechBlog
株式会社i-Vinciの技術ブログ

Pythonを使ってスタブAPIを作ってみた

こんにちは、i-VinciのG.G.佐藤です。

この記事では、スタブが用意できない状況で、外部APIへのリクエストの実施や、ステータスコードを受け取った際の動作を確認したい際に使える、スタブAPIをPythonで実装してみます。
今回はPythonのFlaskフレームワークを使用します。

スタブAPIの作成手順

以下に、スタブAPIの作成手順を記載していきます。
お暇な方は一緒に作成してみましょう:-)

開発環境のセットアップ

まず、以下の開発環境を導入します。
pythonコマンドが利用可能であることを確認してください。

python --version
Python 3.10.5

上記例ではPython 3.10.5ですが、基本的に最新の安定版を使用することをお勧めします。

  • Python: 3.11.1(執筆時点の最新の安定版)
  • Webフレームワーク: Flask

プロジェクトの作成

まず、適当なディレクトリにプロジェクトフォルダを作成します。ここでは"stub-api"という名前のフォルダを使用します。

mkdir stub-api
cd stub-api

仮想環境のセットアップ

次に、Pythonの仮想環境を作成してアクティブにします。

python -m venv venv

Windowsの場合:

venv\Scripts\activate

macOS/Linuxの場合:

source venv/bin/activate

Flaskのインストール

仮想環境がアクティブになっていることを確認したら、Flaskをインストールします。

pip install flask

スタブAPIの作成

プロジェクトフォルダに"api.py"という名前のファイルを作成し、以下のコードを追加します。

from flask import Flask, request
import logging
import os
import json

app = Flask(__name__)
# ログの設定
logging.basicConfig(filename='api.log', level=logging.INFO)

@app.route('/', defaults={'path': ''}, methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])
def stub_api(path):
    # ステータスコードの設定
    status_code = 200 if path == "" else int(path.split('/')[-1])
    # リクエストのヘッダーとボディの情報をログに出力
    log_request_info()
    return callJson(), status_code

# リクエストのヘッダーとボディの情報をログに出力する
def log_request_info():
    # リクエストのヘッダーをログに出力
    headers = dict(request.headers)
    logging.info('Request Headers: %s', headers)
    # リクエストのボディをログに出力
    body = request.get_data(as_text=True)
    logging.info('Request Body: %s', body)

# "test.json"からJSON形式のデータを取得する
def callJson():  

 # 現在のスクリプトのディレクトリパスを取得
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # JSONファイルの相対パスを指定
    json_file_path = os.path.join(script_dir, 'test.json')
    # JSONファイルを読み込む
    with open(json_file_path, 'r') as file:
        data = json.load(file)
    return data

if __name__ == '__main__':
    app.run()

このコードでは、Flaskを使用してAPIを作成しています。"/"(ルート)パスおよび"/"パスに対して、GET/POST/PUT/PATCH/DELETEのHTTPメソッドを受け付けるように設定しています。
ステータスコードはリクエストURLの末尾の数字を取得し、それをレスポンスのステータスコードとして返します。

また、リクエストのヘッダーとボディの情報をログファイルに出力し、予め用意したJSONファイルのデータをレスポンスのボディとして返します。

JSONファイルの作成

プロジェクトフォルダに"test.json"という名前のJSONファイルを作成し、適当なデータを追加します。こちらはスタブAPIのレスポンスの一部として返されます。

{
  "message": "This is a test response"
}

スタブAPIの実行

すべての設定が完了したら、以下のコマンドを使用してスタブAPIを実行します。

python api.py

APIは"localhost:5000/"でアクセス可能です。

リクエストのテスト

任意のHTTPクライアントツール(例:curl、Postman、またはWebブラウザ)を使用して、スタブAPIへのリクエストをテストできます。
今回はAdvanced REST clientを使用して動作確認を行いました。

実際に、ブラウザでlocalhostにアクセスした画像が以下になります。

localhost_5000

以下はいくつか実施したリクエストテストの例です。

  • GETリクエスト(ステータスコード200を返す):

    GET_200

  • POSTリクエスト(ステータスコード204を返す):

    POST_204

  • PUTリクエスト(ステータスコード404を返す):

    PUT_404

  • DELETEリクエスト(ステータスコード500を返す):

    DELETE_500

ログファイルの確認

スタブAPIはリクエストのヘッダーとボディの情報を"log/api.log"ファイルに出力します。APIの動作を確認するためにログファイルをチェックしてください。

以上で、スタブAPIの作成手順の説明を終えます。
これにより、スタブが用意できない状況下でも、自作することで乗り切れるということがお分かりいただけたかと思います。
いざという時の手札の一枚として、参考になれば幸いです。