Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

flaskでREST APIを体験してみる

今更感ありますが、、、今回はREST APIについてまとめていきたいと思います。
また、REST APIについて記事や本を読んでもよく分からず、
実際にREST APIを体験するためにflaskでREST APIを作成してみましたので、
備忘録も兼ねてブログにまとめたいと思います!!



REST APIとは?

そもそもRESTとは、、
REpresentational State Transferの略になります。

このRESTに関して、RESTの4原則があり、この4原則を満たすものをRESTfulと呼んだりします。
RESTの4原則ですが、

1.セッションなどの状態管理を行わない。(やり取りされる情報はそれ自体で完結して解釈することができる)
2.情報を操作する命令の体系が予め定義・共有されている。(HTTPのGETやPOSTメソッドなど)
3.すべての情報は汎用的な構文で一意に識別される。(URLやURIなど)
4.情報の内部に、別の情報や(その情報の別の)状態へのリンクを含めることができる。

になります。

このRESTの考えを用いてAPIを設計・作成したものをREST APIと言います。

具体的には、
RESTful APIとは、Webシステムを外部から利用するためのプログラムの呼び出し規約(API)の種類の一つで、
「REST」(レスト)と呼ばれる設計原則に従って策定されたもの。
RESTそのものは適用範囲の広い抽象的なモデルだが、
一般的にはRESTの考え方をWeb APIに適用したものをRESTful APIと呼んでいる。
※参考:RESTful API(REST API)とは - IT用語辞典 e-Words

とのことです!!

具体的にはこちらの記事をご参照ください。
0からREST APIについて調べてみた - Qiita

こちらに掲載されている、
RESTなAPIとそうではないAPIの例
が個人的に分かりやすく、REST APIに関して理解が進みました。

■FlaskでREST APIを作成してみる

REST APIに関して文字でまとめてみましたが、、
文字だけではよく分からない!!と思いましたので、実際に作成して動かすことで体験してみました。

今回使用するのはpythonのFlaskです。
Flaskを使用した理由ですが、
個人的に一番使い慣れたサーバーサイドのWebアプリケーションフレームワークだったためです。

では早速コードを載せます。
今回作成したコードはこちら!!

from flask import Flask, jsonify, abort, request
import json

app = Flask(__name__)

datas = [
    {"id":1, "name":"hoge", "category":"manga","quantity":5},
    {"id":2, "name":"huga", "category":"magazine","quantity":10},
    {"id":3, "name":"hogehuga", "category":"magazine","quantity":1}
]

# 一覧取得
@app.route('/bookstore', methods=['GET'])
def findBookFromName():
    retList = []
    
    for d in datas:
        retList.append(d)

    if len(retList) > 0:
        return jsonify(retList)
    else:
        return "",400

# idで指定した項目の抽出
@app.route('/bookstore/<int:id>', methods=['GET'])
def findBookFromId(id):
    ret = ""
    for d in datas:
        if d["id"] == id:
            ret = d
    
    if ret != "":
        return jsonify(ret)
    else:
        return "",400

# データ追加
@app.route('/bookstore', methods=['POST'])
def addBooks():
    postedData = request.data.decode('utf-8')
    postedData = json.loads(postedData)
    bookData = {
        "id":int(postedData["id"]),
        "name":postedData["name"],
        "category":postedData["category"],
        "quantity":int(postedData["quantity"])
    }
    datas.append(bookData)

    return '',200

#データ更新
@app.route('/bookstore/', methods=['PUT'])
def putBook():
    putData = request.data.decode('utf-8')
    putData = json.loads(putData)
    ret = ""
    print(putData["name"])
    for d in datas:
        if d["id"] == putData["id"]:
            ret = d

    ret["name"] = putData["name"]
    ret["category"] = putData["category"]
    ret["quantity"] = putData["quantity"]

    return '',200


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

APIはそれぞれこちらのようになります。
・一覧取得        :('/bookstore', methods=['GET'])
・idで検索したデータを抽出 :app.route('/bookstore/', methods=['GET'])
・データ追加       :app.route('/bookstore', methods=['POST'])
・データ更新       :app.route('/bookstore/', methods=['PUT'])

では動作確認をしていきます。
curlコマンドを用いてレスポンスを確認する最も簡単になります。

先ほどのコードを実行した上でcurlコマンドを用いて、

curl GET http://127.0.0.1:5000/bookstore

と実行してみてください。

すると、

[
  {
    "category": "manga",
    "id": 1,
    "name": "hoge",
    "quantity": 5
  },
  {
    "category": "magazine",
    "id": 2,
    "name": "huga",
    "quantity": 10
  },
  {
    "category": "magazine",
    "id": 3,
    "name": "hogehuga",
    "quantity": 1
  }
]

といったjson形式であらかじめ登録していたdata変数が表示されるかと思います。

datas = [
    {"id":1, "name":"hoge", "category":"manga","quantity":5},
    {"id":2, "name":"huga", "category":"magazine","quantity":10},
    {"id":3, "name":"hogehuga", "category":"magazine","quantity":1}
]

■最後に

今回はREST APIに関してまとめてみました。
基本的な部分は理解できたのですが、実際にREST APIで複雑なWebアプリを作成する場合にはどうなるんだろう??
逆に複雑化したりしないのかな?
今度Webアプリ作成する際には意識してみようかな?