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/
・データ追加 :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} ]