# Flask實作_WEB API_02_續談WEB API ###### tags: `python` `flask` `api` 在[Flask實作_WEB API_01_初探WEB API](https://hackmd.io/@shaoeChen/BkL3oACzU)裡面已經初步瞭解要利用flask來建置一個api service有多麼簡單,但作法上好像不是那麼科學,要寫一堆的`@app.route`,然後在view function判斷是`GET`還是`POST`,這樣下去整個程式碼會一堆`@app.route`,有點雜亂,應該有什麼比較直觀的作法才對。 當然使用extension是一個辦法(如[Flask-RESTful](https://flask-restful.readthedocs.io/en/latest/)),不過在使用之前我們還是自己先瞭解一下如何單純的利用flask所提供的工具來完成。 ## 說明 在flask內除了利用`@app.route`的方法來建置路由之外,還可以利用類別來建置,這部份可以從[官方文件](https://flask.palletsprojects.com/en/1.1.x/views/)看到更詳細的資料,其中[Method Based Dispatching](https://flask.palletsprojects.com/en/1.1.x/views/#method-based-dispatching)就是我們預計採用的方式。 >For RESTful APIs it’s especially helpful to execute a different function for each HTTP method 官方說明也清楚指出,這對RESTful API是非常有幫助的。 總之,這就是我們預計採用的方式,就動手吧。 ## 實作 一樣的利用[Flask實作_WEB API_01_初探WEB API](https://hackmd.io/@shaoeChen/BkL3oACzU)所新增的專案以及python文件。 首先,清空`pyAPI.py`,然後重新寫入程式碼: ```python= from flask import Flask, jsonify from flask.views import MethodView app = Flask(__name__) class API_Test(MethodView): def get(self): return jsonify(message='I am GET') def post(self): return jsonify(message='I am POST') def delete(self): return jsonify(message='I am DELETE') app.add_url_rule('/test_api/', view_func=API_Test.as_view('test_api')) if __name__ == '__main__': app.run(debug=True) ``` 第2行:這就是採用Method Based Dispatching需要用到的類別 第7行:繼承`MethodView`,依不同的http method設置相對應的class method 第18行:利用`app.add_url_rule`註冊路由並定義相對應的view function 接著執行專案,然後你可以試著用python的套件`requests`測試api是否正常,這並不是標準套件,所以如果沒有的話就需要安裝: ```shell pip install requests ``` 然後就試著呼叫get: ```python api_get = requests.get(url='http://127.0.0.1:5000/test_api/') ``` 回傳的是Response的物件 ```python= type(api_get) <class 'requests.models.Response'> ``` 我們可以從這個物件取得我們想要的很多資訊: ```python api_get.json() {'message': 'I am GET'} ``` ```python api_post = requests.post(url='http://127.0.0.1:5000/test_api/') api_post.json() {'message': 'I am POST'} ``` ```python api_delete = requests.delete(url='http://127.0.0.1:5000/test_api/') api_delete.json() {'message': 'I am DELETE'} ``` ## 結論 相同的事情如果用`@app.route`的方式作,可能會像下面這樣: ```python @app.route('test_api2', methods=['GET']) def test_api2_get(): pass @app.route('test_api2', methods=['POST']) def test_api2_post(): pass ``` 相較之下,直接使用建置類別的方式似乎除了比較好維護之外也比較直觀。不管如何,我們已經知道怎麼樣利用flask來建置一個api service,但,好像少了什麼,似乎應該要有身份的驗證才對,這讓人傷腦筋,下一次再來煩惱。