見出し画像

FlaskでWebAPIを作る・利用する①

このたび、ノンプログラマーのためのスキルアップ研究会(以下、ノンプロ研)のご支援のもとで「ラズパイとFlaskでつくる!Webアプリ開発入門」という技術同人誌を出させていただく事になりました。

購入はこちらから!

そこでこの記事では、本の追加コンテンツみたいな感じで、簡単に作れるWebアプリなどを書いていきます。
本を買ってくださった方はぜひ試してみて下さい!


WebAPIとは?

Webアプリの開発は、URLを定義→そのURLで行われる処理を実装、という形で進めていきます。
この時定義されたURLは、Webアプリではないプログラムからアクセスし、URLで行われる処理の結果をそのプログラムにおいて利用することもできます。
かなり乱暴な言い方ですが、これがWebAPIと呼ばれるもので、Flaskでも開発・実装することが出来ます。
WebAPIを開発する利点には以下のようなものがあります。
・Excel VBAやJavaScriptなど、他の言語で書かれたプログラムからも利用できる
・画面用のhtmlファイルを用意する必要がなく、作成しやすい
そこで、この記事から一連の記事では、FlaskでのWebAPIの作成とその利用方法を書いていきます。
なお、WebAPIの詳細な説明は下記のリンクをご覧ください。

西暦から現在の年齢と干支を算出するWebAPIを作る

簡単なWebAPIとして、西暦から、その年に生まれた人の現在の年齢と干支を算出するWebAPIを作ります。
まずは全コードを載せます。

from flask import Flask, Response
import json
import datetime

app = Flask(__name__)

@app.route('/', methods=['GET'])
def year_change_get():
    # リクエストされたクエリパラメータからyearを取得し、整数型に変換
    year = int(request.args.get('year', datetime.date.today().year))

    # 現在の年齢を計算
    age = f"{datetime.date.today().year - year}歳"
    
    # 干支の特定
    eto = ["申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"]
    eto = eto[year % 12]
    
    # JSONデータへの変換
    data = {
        '年齢と干支': f"{age}({eto})",
    }
    response = Response(response=json.dumps(data, ensure_ascii=False), status=200, mimetype='application/json')
    return response

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

WebAPIのコードの説明

※コードの説明につきましては、拙著を購読下さった前提で進めさせていただきます。

必要なライブラリのインポート

from flask import Flask, Response
import json
import datetime

まずは必要なライブラリをインポートします。
このWebAPIではFlaskの他に、算出結果をJSON形式で返すためのResponseとjson、現在の年齢を算出するためのdatetimeを使います。

URLと関数の定義

@app.route('/', methods=['GET'])
def year_change_get():
    # リクエストされたクエリパラメータからyearを取得し、整数型に変換
    year = int(request.args.get('year', datetime.date.today().year))

HTTPメソッドはGETメソッドを使い、クエリパラメータとしてyearが与えられていればその値を、そうでなければ現在の西暦年をyearとして取得します。クエリパラメータから取得した値は文字列として取得するため、整数型に変換して次の処理へつなげます。

現在の年齢と干支を算出する

    # 現在の年齢を計算
    age = f"{datetime.date.today().year - year}歳"
    
    # 干支の特定
    eto = ["申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"]
    eto = eto[year % 12]

引数yearをもとに現在の年齢と干支を算出していきます。
現在の年齢の算出については、datetime.date.today().yearにより今日の日付から西暦年を取得してそこからyearを引くことで算出します。
干支については、申年から始まる干支のリストを用意し、yearを12で割った余りの数に対応する番号の干支を取得します。

JSON形式でデータを返す

    # JSONデータへの変換 
   data = {
        '年齢と干支': f"{age}({eto})",
    }
    response = Response(response=json.dumps(data, ensure_ascii=False), status=200, mimetype='application/json')
    return response

WebAPIではデータの送受信形式としてJSONを使うことが一般的ですので、JSON形式でデータを返していきます。
キー名を「年齢と干支」、算出したageとetoを合わせて1つの文字列データを値として「data」というJSONデータとし、HTTPレスポンスのボディとして返します。
Response関数の個別の引数について確認しましょう。
まず、response=json.dumps(data,ensure_ascii=False)についてですが、上記のdataをjson.dumpsによりJSON形式にエンコードしています。また、ensure_ascii=Falseとすることで、日本語をそのまま出力するようにしています。
その次のstatus=200はステータスコードが200としてレスポンスが成功したこと、mimetype='application/json'は内容がJSONであることをデータの送信元に知らせます。
HTTPレスポンスとは、送信されたデータをサーバが処理をして送信元に返信する応答のことです。サーバにリクエストを送ると、メソッドに応じた処理がサーバで行われ、処理結果が「レスポンス」として返送されます。

WebAPIを起動する

コードの解説も終わりましたので、ngrokを使って起動してみましょう。
起動時はクエリパラメータは渡されていないので、現在の西暦年で計算された年齢と干支がJSON形式でブラウザに表示されます。


URL欄の「free.app」以下に、クエリパラメータ「?year=2020」と入力して移動すると、次の画面が出てきます。

これだけでは役に立ちませんが、このWebAPIを起動させておけば他のプログラムで利用することができます。さっそく利用してみましょう。

他のPCから、Pythonを使ってWebAPIを利用する

PythonでのWebAPIを利用するにあたってはrequestsライブラリが必要になりますので、インストールしましょう。

pip install requests

インストールしたら、次のコードを書きましょう。

import requests

url = 'https://xxxx.ngrok-free.app' # ngrokで公開したURL
    
# パラメータとして送信する年
params = {'year': 2020}

# GETリクエストを送信
response = requests.get(url, params=params)

# レスポンスの内容を表示
print(response.text)

# レスポンスをJSON形式に変換
api_json = response.json()

# JSON形式に変換したレスポンスデータの表示
print(api_json.keys())
print(api_json.values())

コードを実行すると、CLI画面上で算出結果を確認することができます。

WebAPI呼び出しコードの説明

WebAPIへのリクエストの送信

import requests

url = 'https://xxxx.ngrok-free.app' # ngrokで公開したURL
    
# パラメータとして送信する年
params = {'year': 2020}

# GETリクエストを送信
response = requests.get(url, params=params)

requestsライブラリをインポートした後、WebAPIのURLを指定し、パラメータ名yearとその値を辞書形式で定義します。
その後、requests.get()関数を使用して、設定したurlにリクエストを送信します。params=paramにより、リクエストのURLにクエリパラメータparamが追加されて送信されます。
なお、requests.get()関数を使っているのは、送信先のURLがGETメソッドしか許可していないためです。送信先のURLがPOSTメソッドしか許可していない場合はrequests.post()関数を使います。

レスポンス結果の表示

# レスポンスの内容を表示
print(response.text)

# レスポンスをJSON形式に変換
api_json = response.json()

# JSON形式に変換したレスポンスデータの表示
print(api_json.keys())
print(api_json.values())

最初のコードでは、text属性を使用して、サーバーからのレスポンスの本文を取得しています。ただし、このコードではレスポンスを文字列形式で返すため、レスポンスがJSON形式に見えてもキーや値を取得することができません。そこで以降のコードではresponse.json()によりレスポンスをJSON形式に変換することで、キーや値を出力できるようにしています。

この記事では、簡単なWebAPIの作成とPythonでの利用方法を書きましたが、WebAPIはExcelVBAでも利用することができます。次回の記事では、WebAPIはExcelVBAで利用する方法を書きたいと思います。

この記事が気に入ったらサポートをしてみませんか?