技術は使ってなんぼ

自分が得たものを誰かの役に立てたい

【Python】FastAPIを使って、API化したプログラムの結果を自分のコードに呼び出そう ~実践編~

こんにちは。

前回に続いて、今回はFastAPIの実践編ということで、もう少し実用的な使い方を紹介します。

人が作ったプログラムを自分のプログラム内で呼び出せたら楽だろうなって思ったこと、ありませんか?

一度作ったプログラムもらったけど、3日後には大幅に改修されてまたもらわないといけなくて面倒って思ったこと、ありませんか?

そんなお困りごとを解決するのに、FastAPIを使ったAPI化が役に立つかもしれません。

今回はその役に立つサンプルコードを紹介しながら解説していきます。

以下、目次になります。

それではよろしくお願いします。



requestsを使って、自分のコード内に呼び出す

前回作ったHelloworldですが、WEBページで開くのではなく、自分のコード上に呼び出せます。

PythonのHTTPライブラリのrequestsを使います。

requests.readthedocs.io

ではpip installで自分の開発環境にインストールしましょう。

$ pip install requests

インストールが完了したら以下のスクリプトを作成します。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"}

ファイル名は「helloworld.py」としましょう。

それではAPIを立ち上げます。

以下のコマンドで立ち上げましょう。

$ uvicorn helloworld:app --reload

「Application startup complete.」と表示されればOKです。

このまま実行したままにしておき、別のコマンドプロンプトを起動してください。

次に、呼び出す側のスクリプトを作成します。

import requests
import json

def main():
    url = "http://127.0.0.1:8000/"
    res = requests.get(url)
    print(res.json())

if __name__ == "__main__":
    main()

こちらのファイル名は「test.py」としましょう。

jsonPythonの標準ライブラリとして存在するので、インストールは不要です。

ここで重要なのが、FastAPIのデータのやりとりはjson形式であるということを覚えておいてください。

それではAPIとは別で立ち上げたコマンドプロンプトにて、以下のコマンドを実行してみましょう。

$ python test.py

コマンド上に「{'message': 'Hello World'}」と表示されます。

これでURLにアクセスすることで、URL先のAPIの結果を得ることができるようになるということです。

少し具体例をあげると、例えば社内ネットワークでAさんがAPIを立ち上げていたとします。

そのAPIを使いたい社内のBさんがいた場合、BさんはAさんのPCのIPアドレスとポート番号にアクセスするだけでAPIを使用することができるのです。

これは車輪の再発明を防ぐことであり、社内での開発効率の向上にもつながるというわけです。

パスパラメータを使って、指定した値で動かした結果を得る

ではもう少し汎用性をあげるサンプルを紹介しましょう。

URLのパスに値を指定することで、APIに値を渡すことができるのです。

これをパスパラメータといいます。

fastapi.tiangolo.com

実際にスクリプトを書いてみましょう。

先ほどのhelloworld.pyを以下のように変更してください。

from fastapi import FastAPI

app = FastAPI()

@app.get("/{name}")
def root(name: str):
    return {"message": f"Hello World {name}"}

@app.get("/{name}")がポイントです。これはURLの最後にパラメータとして受け取ることができます。

その下に「name: str」とありますが、型指定ができます。

これは文字列以外受け付けないという、バリデーションという機能になります。

ではtest.pyも以下のように変更します。

import requests

def main():
    url = "http://127.0.0.1:8000/takeshi"
    res = requests.get(url)
    print(res.json())

if __name__ == "__main__":
    main()

URLに名前を指定するだけですね。

では同じ様に実行してみましょう。

「{'message': 'Hello World takeshi'}」と返ってきます。

まとめと次回予告

いかがでしょうか?

API化したプログラムを自分のプログラム上で呼び出す方法について解説しました。

作ったプログラムをAPI化すれば、他の開発者と共有出来て効率の良い開発システムが構築できます。

これで色んなアイディアが具体的なレベルでイメージできてきたのではないでしょうか?

しかしきっとこのような疑問があるはずです。

「複数の引数を関数に渡す場合、パスパラメータにいちいち書くのは無理があるのでは?」

「やっぱり複雑な関数や機能のAPI化には向いていないのではないか?」

これを解決するのが、次回紹介するリクエストボディです。

fastapi.tiangolo.com

次回はリクエストボディを使って、複数の引数を渡す方法を解説します。

そしてそのAPIには簡易的な機械学習を実装したいと思います。

今回はここまで。

最後までご覧いただき、ありがとうございました。