# 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:  然後我們先連接`test_api`,網址輸入`http://127.0.0.1:5000/test_api/`,這是利用flask所提供的`jsonify`回傳的json格式資料:  上圖紅框處注意。 然後再連接`test_api2`,網址輸入`http://127.0.0.1:5000/test_api2/`:  上圖紅框處注意。 兩相比較就清楚了,原來使用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') ``` 見下圖紅框處:  ## 結論 透過一個簡單的案例,我們已經對WEB API有一個最簡單的認識,後續再接著說明API建置的部份。
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.