こんにちは。はけです。

普段、システム開発会社でシステムエンジニアをしています。

ところで皆さまはこんなことを思ったことはありますでしょうか。

  • APIの環境がすぐに出来ないからAPIのスタブを作りたい。
  • APIを簡単につくる方法が知りたい。
  • PythonでAPIを作りたい!!!

私もつい最近、仕事でAPIを作ろうとしました。

そのときにPythonFlaskを使用してWEBAPIを作成しましたが、
とっっても簡単だったんです!!!

ということで簡単にできるFlaskでのWEBAPIの作成方法をこの記事で紹介していきたいと思います!!

この記事を読むことでそれこそものの1時間でWEBAPIを作ることができるようになります。

私が実践した内容をもとに紹介しておりますので、ぜひ皆様も一度試してみてくださいね。

簡単にできる!WEBAPIをFlaskを使って作成する!!

では、PythonのFlaskを使用してWEBAPIを作成していこうと思います。

本当に簡単にAPIが作れてしまうので試してみましょう!

ここでさきほどからちょこちょこ出てきているFlaskを簡単に紹介します。

FlaskはWEBアプリを作成するためのフレームワークとなります。シンプルにつくれることが最大のメリットでスタブや個人だけが使用するツールなど簡易的に作るのには最適のフレームワークです。

今回はこのFlaskを使用してWEBAPIをつくっていきます。

実行環境を確認する

私が確認した際の実行環境は以下になります。

  • Windows10
  • Python 3.7
  • Flask 1.1.2

まずはFlaskをインストールする

以下のコマンドでFlaskをインストールしてください。

pip3 install Flask

私の場合はPyCharmを使用しているのでPyCharm上でインストールを行いました。(設定の「プロジェクト・インタープリター」、「+」でライブラリを追加できます)

単純なFlaskでHTTP接続を試してみる

さっそく、次のPythonファイルを作成し、実行してみましょう!

Flaskのコードを書いたファイルを作成します

次のファイルを作成してください。

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify({'message': 'Hello world'})

if __name__ == "__main__":
    app.run(host='127.0.0.1', port=8888, debug=True)

ソースはこれだけです!!

簡単に解説します。

  • 「@app.route(‘/’)」の部分で受け付けるURLを指定しています。
  • 「app.run(host=’127.0.0.1′, port=8888, debug=True)」の部分で「127.0.0.1」でAPIにアクセスができるようにアプリを実行しています。ポート番号は8888を指定していますが、ここは自由に変えることができます。
  • この2つの命令によって、「http://127.0.0.1:8888/」でアクセスが可能となります。
  • このURLでアクセスされた場合、「hello_world()」関数が実行されます。
  • 「hello_world()」関数では、messageにHello worldを設定したものをjson形式で返しています。これは見たほうが早いので次の章でどんなものを返しているかを確認してください。

コードを実行する

では先ほど作成したコードを実行しましょう!

コマンドプロンプトなどで次のコードで実行してください。

python3 test_flask.py

すると、次のような出力が出ます。

「Running on http://127.0.0.1:8888/ (Press CTRL+C to quit)」これが出れば、成功です。

「http://127.0.0.1:8888/ 」にGoogleChromeなどのブラウザを使ってアクセスしてみてください。

ブラウザ上に「Hello World」が表示されていることがわかります。ちなみにこの{}でくくられる書き方がjsonといいます。

これだけのコードを書くだけで、簡単にAPIを作成することができました。

一番単純なAPIの作成は以上ですが、以降の記事では要求や応答の種類別実装方法を解説します。

要求方法の種類を学ぶ

では要求方法について解説します。

要求種別に合わせたAPIをつくる!

要求種別は次の表のような種類があり、処理の内容によって適切な種類を使用することが推奨されています。

処理処理種別
取得GET
登録POST
更新PUT
削除DELETE

この要求種別によって、APIのパラメータ(引数)の取得方法が変わります。

要求種別=GETのAPIを作成する

GETは、URLにパラメータをくっつける要求です。

例えば「http://localhost:8888/?user=aiueo」のようなURLを送付します。

このURLは「?」以降の「user=aiueo」をパラメータ(引数)と認識します。userという変数にaiueoが設定されます。

FlaskのAPIではこのGETがデフォルトになっています。

from flask import Flask, jsonify, request
…
@app.route('/', methods=["GET"])
def get_user():
    user = request.args.get("user")
…

明示的にGETを指定する場合、「@app.route(‘/’, methods=[“GET”])」のようにmethodsを指定します。指定なしでもGETとして扱われます。

このコードの場合、request.args.getを使用して「user」パラメータを取得しています。

要求種別=POST、PUT、DELETEのAPIを作成する

基本的にPOST/PUT/DELETEは受信方法は同じです。

次のようなコードを書きます。

…
@app.route('/data/', methods=["POST"])
def post_user_date():
    user = request.json["user"]
    date = request.json["date"]
…
@app.route('/data/', methods=["PUT"])
def put_user_date():
    user = request.json["user"]
    date = request.json["date"]
…
@app.route('/data/', methods=["DELETE"])
def delete_user_date():
    user = request.json["user"]
    date = request.json["date"]
…

GETのときと同じように、methods=[“POST”]などのように要求種別を指定することができます。

パラメータ(引数)の取得方法はGETと違い、「request.args.get」では取得できません。

ここではrequest.jsonを使用して「user」や「date」を取得しています。これはjson形式での要求を想定しています。

要求の形式に合わせたAPIを作成する

要求の形式は、jsonxml、x-www-form-urlencodedなどありますが、よく使用されるjsonやxmlが処理できるAPIの作成方法を解説します。

json形式の要求に合わせたAPIを作成する

json形式のAPIは先ほどの記事で紹介した「request.json[“変数名”]」の形でパラメータを取得できます。

…
@app.route('/data/', methods=["POST"])
def post_user_date():
    user = request.json["user"]
    date = request.json["date"]
…
xml形式の要求に合わせたAPIを作成する

xml形式での要求を取得する場合、xmlの解析が必要になります。

解析用に「xmltodict」というライブラリが使えます。ライブラリのインストールを行った上で次のコードを書いてください。

from flask import Flask, jsonify, request
import xmltodict
…
@app.route('/data/', methods=["POST"])
def post_user_date():
    data = xmltodict.parse(request.data.decode())
    user = data['request']['user']
    date= data['request']['date']
…

xml形式の場合、

  • 「request.data.decode()」で要求データをデコードしたのち、
  • 「xmltodict.parse」で解析を行います。解析後は、ディクショナリ型のデータが出来上がります。

この解析後のデータ(ディクショナリ型)を使用することで、任意のパラメータを取得することが出来ます。

応答方法の種類を学ぶ

要求方法を学びましたが、同じように応答方法も自在に変更できます。応答の形式もjson/xml/textなどの形式があります。

この記事では、jsonとtextで応答する方法を解説します。

json形式で応答を作成する

json形式で応答を行うため、次のようなコードを書いてください。

…
@app.route('/data/', methods=["POST"])
def post_user_date():
    user = request.json["user"]
    date = request.json["date"]
    return jsonify({'user': user, 'date': date})   
…

「jsonify」を使用することでPythonのディクショナリ型の変数をjson形式に変換して応答を行うことができます。

text形式で応答を作成する

text形式で応答を行うため、次のようなコードを書いてください。

…
@app.route('/', methods=["POST"])
def post_user():
    user = request.json["user"]
    date = request.json["date"]
    return "user:" + user + ", date:" + date
…

とても簡単です。

単純にstring形式の変数をreturnに設定するだけです。

これでtext形式の応答を行うことができます。

まとめ

以上が、簡単にできる!WEBAPIをFlaskを使って作成する方法でした。

まとめとして、本記事では次のことを紹介しました。

  • WEBAPIをFlaskを使って作成する方法
  • Flaskを使ってAPIを作成する際の、種類別要求方法
  • Flaskを使ってAPIを作成する際の、種類別応答方法

長々と読んでいただいてありがとうございました!