# Flask實作_WEB API_01_初探WEB API ###### tags: `python` `flask` `api` Flask除了可以用以開發網頁之後,其實它還很適合應用建置一個API Service。說到這個就不能不知道Roy Fielding其論文中所提的[REST架構說明](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm),不過這邊只談實作而不說明過多理論,但會建議多少瞭解一下,最少最少瞭解一下一個完美的REST應該有的六個特性。 ## 說明 當我們希望建置一個滿足REST的API SERVICE時要先知道,REST(Resource Representational State Transfer),資源(Resource)是REST的核心,什麼都是資源,每個資源都是一個URI,每個URI都表示一個唯一的資源。舉例來說,`http://your_web_service/api/v1/blog/001`,這個URI代表版本v1,取得編號001的貼文,而且這個行為是idempotent(幕等)的,這代表不管你做幾次都會得到相同的結果(部份method除外)。 為什麼要有版本?因為可能會調整,但你的API可能已經open出去,已經很多開發人員在使用了,你不可能就突然調整為另一個版本,這可能會造成引用你API的客戶端程式異常。 呼叫API的幾種方式,GET、POST、PUT、PATCH和DELETE,其中GET、POST是最常用的,每次都會有相對應的[狀態回應](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Status),像是200、201、400、404、405,這都有相對應的標準定義。 呼叫API之後會取得資源,這個資源的回應用什麼格式?JSON或是XML(一般來說現在都採用JSON),要取得相對應的回應就需要在發出request的時候設置`Content-Type: application/json`讓server端知道你需求的格式為JSON。 所以你的response的資料格式可能是這樣: ```json { "blog_url": "http://your_web_service/api/v1/blog/001", "body": "blog text", "author": "http://your_web_service/api/v1/author/shaoe" } ``` 這邊可以看的到,`author`的資料並不是直接給author,而是另一個URI,這麼做的好處在於,開發人員只需要有頂層的API就可以,剩下的就透過說明一路給開發人員探索就行了。 另外,想要弄API Service並不是一定要滿足REST,就好像也有人寫Python也不Pythonic一樣。只是一但你滿足REST規範,那你就很RESTful。總之就是很潮就是了。 ## 實作 說那麼多實在是不如親手做一遍,首先建立一個新的專案,並設置虛擬環境,然後安裝需求套件,專案名稱設置為"pyAPI"。 ```shell pip install flask ``` 新增一個python文件,命名為`pyAPI.py` ```python= from flask import Flask, jsonify import json app = Flask(__name__) @app.route('/test_api/', methods=['GET']) def test_api(): return jsonify(message='Hello, API') @app.route('/test_api2/', methods=['GET']) def test_api2(): return json.dumps(message='Hello, API2') if __name__ == '__main__': app.run(debug=True) ``` 我們載入的套件除了`Flask`,另外還有一個`jsonify`,並且設置兩個API,一個是利用flask所提供的`jsonify`,一個是自己利用`json.dumps`,快速瞭解有什麼差異。 執行專案之後,直接開啟chrome,按f12,點擊Network: ![](https://i.imgur.com/TFqsaqX.png) 然後我們先連接`test_api`,網址輸入`http://127.0.0.1:5000/test_api/`,這是利用flask所提供的`jsonify`回傳的json格式資料: ![](https://i.imgur.com/rv4TLhO.png) 上圖紅框處注意。 然後再連接`test_api2`,網址輸入`http://127.0.0.1:5000/test_api2/`: ![](https://i.imgur.com/DlavHzO.png) 上圖紅框處注意。 兩相比較就清楚了,原來使用flask所提供的`jsonify`,它會幫我們處理好response的Response Headers的部份。 當然如果你真的想要自己處理的話也可以,再追加載入套件 ```python from flask import Response ``` 接著再加入一個接口: ```python @app.route('/test_api3/', methods=['GET']) def test_api3(): return Response(json.dumps({'message': 'Hello, API2'}), mimetype='application/json') ``` 見下圖紅框處: ![](https://i.imgur.com/CAyksgX.png) ## 結論 透過一個簡單的案例,我們已經對WEB API有一個最簡單的認識,後續再接著說明API建置的部份。