PythonでPydanticモデル、FastAPIを使用しエンドポイントにPOSTリクエストを送信するAPIを作成してみます。
なお、Pydantic、FastAPIはPythonの標準ライブラリではないので、事前にインストールする必要があります。また、今回はtypingモジュールも用います。こちらは標準ライブラリですので、事前にインストールする必要はありません。
■Python、環境
Python 3.8.10(Windows11)
■Pydanticモデル、FastAPIを使用しエンドポイントにPOSTリクエストを送信するAPIの作成
では、早速Pydanticモデル、FastAPIを使用しエンドポイントにPOSTリクエストを送信するAPIを作成するためにコードを書いていきます。
■コード
from typing import List from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float class User(BaseModel): username: str full_name: str class Order(BaseModel): user: User items: List[Item] @app.post("/orders/") async def create_order(order: Order): return {"order": order}
まずは「from import」でpydanticモジュールのBaseModelを呼び出します。その後、Itemというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてBaseModelを渡します。これでBaseModelを継承した形になる。(なお、これはPydanticのモデルを定義することでもあります。)そしてクラス内には「name、price」の2つの属性を記述します。各属性には、文字列(str)型なのか、浮動小数点数(float)型なのかを指定します。
次に、Userというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。(なお、これはPydanticのモデルを定義することでもあります。)括弧内には引数,パラメータとしてBaseModelを渡します。そしてモデル内には「username、full_name」の2つの属性を記述します。各属性には、文字列(str)型を指定します。
次に、Orderというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。(なお、これはPydanticのモデルを定義することでもあります。)括弧内には引数,パラメータとしてBaseModelを渡します。そしてモデル内には「user、items」の2つの属性を記述します。各属性には、文字列(str)型を指定します。またitemsの場合は、「items: List[Item]」と記述し、itemsはItemオブジェクトの複数のインスタンスを保持するリストであることを指定します。
指定後、「@app.post(“/orders/”)」でFastAPIのデコレーターで”/orders/”というエンドポイントにPOSTリクエストを送信することを定義します。定義後、その中にHTTP POSTリクエストが送信されると、OrderモデルのJSON形式のリクエストボディを受け取り、その情報を含む辞書形式のレスポンスを返す関数であるcreate_orderをasync def(非同期)を用いて定義します。定義後、このコードを「test_api.py」というファイルで、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存します。
■requestsライブラリを使用しJSONデータを含むPOSTリクエストをエンドポイントに送信する
保存後、requestsライブラリを使用しJSONデータを含むPOSTリクエストをエンドポイントに送信するコードを書いていきます。なお、requestsはPythonの標準ライブラリではないので、事前にインストールする必要があります。
■コード
import requests order_data = { "user": { "username": "tanaka", "full_name": "TESETAROU TANAKA" }, "items": [ { "name": "Apple", "price": 198.00 }, { "name": "Banana", "price": 195.91 } ] } response = requests.post("http://localhost:8000/orders/", json=order_data) print(response.status_code) print(response.json())
今回は、importでrequestsモジュールを呼び出します。その後、order_dataという変数を定義し、その中にデータをJSON形式で記述します。記述後、responseという変数を定義し、その中でrequests.post()を用います。これで指定されたURLに対してPOSTリクエストを送信し、レスポンスが返されます。今回指定するURLはローカル上で検証するために、「http://localhost:8000/orders/」となります。これを括弧内の第1の引数,パラメータとして渡します。次に第2の引数,パラメータとして「json=order_data」を記述します。これでオブジェクト(order_data変数)がJSONエンコードされ、HTTPリクエストのボディ部分に設定されます。この関数が呼び出された後、レスポンスが返されresponse変数に格納。
最後にresponseに対して(.)ドット演算子を用いてstatus_codeを参照する。また返されたレスポンスをjson()を呼び出し、JSON形式で出力します。
■実行・検証
このコードを「request.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。なお、今回は検証のためにuvicornを用います。このライブラリはPythonの標準ライブラリではありませんので、事前にインストールする必要があります。
>python -m uvicorn test_api:app
コマンドプロンプトを起動後、今回は上記のコマンドを入力し、Enterキーを押します。
INFO: Started server process [17060] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
Enterキーを押すと、上記のメッセージが出力されます。これでサーバーが起動しました。
起動後、メッセージが出力されたコマンドプロンプトとは別のコマンドプロンプトを新たに起動します。
>py -3.8 request.py
起動後、上記のコマンドを入力し、Enterキーを押します。
Enterキーを押すとPOSTリクエストを送信し、リクエストが成功(”200”)となり、レスポンスが返されます。返されたレスポンスをJSON形式で出力させることができました。
127.0.0.1:62066 - "POST /orders/ HTTP/1.1" 200 OK
レスポンスが返された後にuvicornを実行しているコマンドプロンプトを確認すると上記のようなメッセージが出力されます。
コメント