PythonによるAPIリクエストとモックサーバー構築

この記事は以下のターゲットを対象としています。

★4 Python開発経験が3年以上。
★3 Python開発経験が1年以上
★2 Python 初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。

こんにちは、グローバルウェイの新田です。

Pythonを使ってWeb APIにリクエストを送る方法とモックサーバーを作ってダミーのAPI処理ができるシステムの構築をセットで解説いたします。

目次

この記事を読んでできるようになること

  • Pythonを使ってAPIへリクエストを送ることができるようになる
  • Pythonを使ってモックサーバーを構築できるようになる

APIとは

API(アプリケーションプログラミングインターフェース)とは異なるシステム間で情報をやり取りするためのものです。

その中でもインターネット経由でHTTP/HTTPSの通信方式を使ってやり取りを行うものをWeb APIと言います。

Web APIはいろいろなものが無料で公開されており、APIによってはウェブブラウザからURLを叩くだけで結果を見られるものもあります。

例として、気象庁が作成した以下のAPIへアクセスすると、東京の天気予報が取得できます。

https://www.jma.go.jp/bosai/forecast/data/overview_forecast/130000.json

他にも一般に公開されているものから、特定のサーバー間でデータをやり取りするためだけのものまでさまざまな種類のAPIが存在しています。

モックサーバーとは

モックとはモックアップを略したもので、それっぽく見えるはりぼて・ちゃんとした中身のないもののことです。

本来サーバーは外部からリクエストを受け取ると内部で他のシステムと連携をしたり、複雑な処理を実行してから、その結果を返します。しかし、モックサーバーの場合は、中身の実装をせずに(もしくは簡略化した実装をし)、それっぽい結果を返すだけです。

モックサーバーを用意することで、サーバー内のシステムができていない状態でも、そのサーバーを呼び出す方のシステムは開発を進めることができるため、特に複数のサーバーが連携して処理を行う大規模なシステム開発で効率的に作業を進めることができます。

準備

本記事では以下の環境で動作確認を行っています。

  • OS: Windows11 Pro
  • Python: Version 3.11.3
  • JupyterLab: Version 4.0.10

JupyterLabのインストール方法・基本的な使用方法については当サイトのPythonによる業務効率化: テキスト検索自動化をご参照ください。

モックサーバーの構築

最初にリクエストの受付口となるモックサーバー側を構築し、そのサーバーに対してAPIリクエストを送るという流れで実装をしていきます。

Pythonでサーバーを構築するためのモジュールはいろいろとあります。簡単なものだとデフォルトでpythonに含まれているhttp.serverモジュール、高機能なものだとDjangoなどがあります。

今回は手軽に使うことができつつ、ある程度複雑なこともできるflaskというモジュールを使用します。

まずはflaskのインストールをします。

pip install Flask

次に公式サイトにある最小限のサンプルコードを動かしてみます。

以下のソースファイルを作成し、hello.pyという名前で保存します。

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

コマンドプロンプトでhello.pyがあるディレクトリ上でflaskを起動します。

$ flask --app hello run
 * Serving Flask app 'hello'
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000

コマンドプロンプトに表示されているURL(http://127.0.0.1:5000)にブラウザでアクセスすると、以下のような画面が表示されるはずです。

これで最低限ではありますが、リクエストに対して応答(今回のプログラムではHello, World!という文字列)を返すサーバーの構築をすることができました。

APIリクエストを送る

続いて、モックサーバーに対してAPIリクエストを送ってみます。

先ほどはサーバーを起動させ続ける必要があったため、pythonファイルを作成し、コマンドプロンプトから起動しました。しかし、APIリクエストを送るときはリクエストを単発で送るだけなので、手軽にコマンドを実行できるJupyterLabを使用します。

APIにリクエストを送るときは、requestsモジュールを使います。このモジュールはデフォルトでpythonに含まれているため、追加のインストールは不要です。

JupyterLab上で以下のコードを実行します。

import requests
# urlは先ほどのモックサーバーのアドレスを指定
url = "http://127.0.0.1:5000"
res = requests.get(url)
# レスポンスステータスを表示
print(res)
# レスポンスデータを表示
print(res.text)

以下の結果が出力されます。

<Response [200]>
<p>Hello, World!</p>

これでサーバーに対してリクエストを送り、Pythonで結果を受け取ることができるようになりました。

いろいろな使い方

ここまでの内容で、サーバーに対してAPIリクエストを送る方法について最低限の動作確認はできました。しかし、これだけでは実際の開発で使うときのイメージがなかなか掴めないと思います。

そこで、いくつか具体的な事例を通して、モックサーバー、APIリクエストをより使いこなす方法を紹介します。

JSONデータをやり取りする

APIで情報をやり取りするときに使うデータ形式の一つにJSONがあります。

冒頭の例として挙げた天気予報のAPIもjson形式でデータを返していました。

jsonデータはPythonでは辞書型の形式で取り込めるため、XMLなどに比べ扱いやすいです。

モックサーバー側

from flask import Flask, Response, request
import json
app = Flask(__name__)

# URLのパスを指定できる
@app.route("/api/test01", methods=["GET"])
def api_test_json():
    json_data = {
        "hoge": "foo"
    }
    resp = Response(
        response=json.dumps(json_data),
        status=200,
    )
    return resp

APIリクエスト側

import requests
url = "http://127.0.0.1:5000/api/test01"
res = requests.get(url)
print(res)
print(res.text)

出力結果

<Response [200]
{"hoge": "foo"}

URLパラメータをモックサーバー側で受け取る

URLのパスやクエリに情報を入れて、サーバー側に渡すことができます。

モックサーバー側でパラメータに応じて挙動を変えることで、より本物のサーバーに近い動作をさせることも可能です。

クエリで渡す方法

モックサーバー側

from flask import Flask, Response, request
import json

app = Flask(__name__)

@app.route("/api/test02", methods=["GET"])
def api_test_url_param01():
    # パラメータの値を取得する
    api_param = request.args.get("api_param")
    json_data = {
        "hoge": api_param
    }
    resp = Response(
        response=json.dumps(json_data),
        status=200,
    )
    return resp

APIリクエスト側

import requests
url = "http://127.0.0.1:5000/api/test02"
params = {"api_param": "hogehoge"}
res = requests.get(url, params=params)
# URLの後ろにクエリパラメータが追加されている(?マーク以降の部分)
print(res.url)
print(res)
print(res.text)

出力結果

http://127.0.0.1:5000/api/test02?api_param=hogehoge
<Response [200]>
{"hoge": "hogehoge"}

URLのパスで渡す

モックサーバー側

from flask import Flask, Response, request
import json
app = Flask(__name__)
# URLのパスの一部を変数として取得できる
@app.route("/api/test03/<param1>/<param2>", methods=["GET"])
def api_test_url_param02(param1, param2):
    json_data = {
        "param1": param1,
        "param2": param2,
    }
    resp = Response(
        response=json.dumps(json_data),
        status=200,
    )
    return resp

APIリクエスト側

import requests
url = "http://127.0.0.1:5000/api/test03/p1/123"
res = requests.get(url)
print(res)
print(res.text)

出力結果

<Response [200]>
{"param1": "p1", "param2": "123"}

ヘッダー情報の付加

コンテンツタイプの指定や、オプション情報を追加することに使用します。

モックサーバー側

from flask import Flask, Response, request
import json
app = Flask(__name__)
@app.route("/api/test_header", methods=["GET"])
def api_test_header():
    # ヘッダー情報を取得
    headers = dict(request.headers)
    resp = Response(
        response=json.dumps(headers),
        status=200,
    )
    return resp

APIリクエスト側

import requests
url = "http://127.0.0.1:5000/api/test_header"
# ヘッダーにコンテンツタイプの設定を追加
headers = {
    'Content-Type': 'application/json',
}
res = requests.get(url, headers=headers)
print(res)
print(res.text)

出力結果

<Response [200]>
{"Host": "127.0.0.1:5000", "User-Agent": "python-requests/2.31.0", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive", "Content-Type": "application/json"}

リクエストメソッドの変更

これまではGETメソッドのリクエストしか扱ってきませんでしたが、POSTやDELETEの場合はGETの箇所を書き換えるだけで使い分けできます。

モックサーバー側

from flask import Flask, Response, request
import json
app = Flask(__name__)
# メソッド指定でPOSTを指定するとPOST形式でのリクエストのみ受け付ける
@app.route("/api/test_method", methods=["POST"])
def api_test_post():
    json_data = {
        "method": request.method
    }
    resp = Response(
        response=json.dumps(json_data),
        status=200,
    )
    return resp

APIリクエスト側

import requests
url = "http://127.0.0.1:5000/api/test_method"
res = requests.post(url, headers=headers)
print(res)
print(res.text)

出力結果

<Response [200]>
{"method": "POST"}

まとめ

今回はモックサーバーの構築方法とWeb APIリクエストの作成方法について説明しました。

Web開発で外部のAPIと連携することや、開発中のサーバーシステムの代替品としてモックサーバーを使うことはよくあることなので、本ブログのやり方が参考になると幸いです。

参考

Quickstart — Flask Documentation (3.0.x)

気象庁のAPIと予報区のコード | WebAPI | あんこエデュケーション

この記事が気に入ったら
いいね または フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次