第一次使用 Python Flask Restful API 就上手 — 使用 POST 方法
Restful API 其實就是開放一個 EndPoit 的網路接口給其他人使用,並將要做的事情封裝在該接口內,不需要知道真實運作狀況,只要得到答案即可。
-
所需的 Python 模組
- flask
- flask_restful
步驟
1. 創建一個完整的 flask (app.py) ,其Code 如下
# 載入必須套件
from flask import Flask, request
from flask_restful import Resource, Api
# 創建Flask app物件
app = Flask(__name__)
api = Api(app)
# 創建一個陣列(創一個名為apple物品當測試),存放品項
items = [
{
"name": "apple",
"price": 32.3
}
]
class Item(Resource):
# 單一品項查詢
def get(self, name):
item = next(filter(lambda x: x['name'] == name, items), None)
return {'item': item}, 200 if item else 404
# 建制新品項
def post(self, name):
# 如果該品項已經存在 items 內,就找出並回傳給客戶端該品項已經存在
if next(filter(lambda x: x['name'] == name, items), None):
return {'message': f'An item with name {name} already exists ..'}, 403
# 如果該品項不存在,則解析客戶端傳來的body,並將其品項寫入 items
data = request.get_json()
item = {'name': name, 'price': data['price']}
items.append(item)
return item, 201
class ItemsList(Resource):
# 取得所有品項
def get(self):
return {'items': items}
api.add_resource(Item, '/item/<string:name>')
api.add_resource(ItemsList, '/items')
if __name__ == "__main__":
app.run(port=5000, debug=True)
- 並執行 python3 app.py , 將服務on起來
2. 下載 PostMan 神器:
PostMan 官網請點我
3. 創建一個 HTTP GET 請求測試 API
-
選擇左邊的 Collection,並產生一個新的 Request, 選擇 Get 方式, 網址為: http//:127.0.0.1:5000/items
- Send 發送
- 確認查看所有品項 API 是正常
- 出現 Apple 品項結果
4. 創建一個 HTTP POST 請求,創建新品項
-
產生一個新的 Request, 選擇 POST 方式,網址為: http//:127.0.0.1:5000/item/banana
- 選擇 Body
- 選擇 Raw
- 選擇 JSON 格式
- 下方輸入一個JSON
{ "price": 23.5 }
- Send 發送
- 品項香蕉及完成創建
5. 測試重複發送 HTTP POST 請求,且品項重複
- 如上一步驟,重複再做一次,伺服器將會回傳該品項已經存在
6. 測試重複發送 HTTP GET 請查,查看單一品項是否已經建立
-
產生一個新的 Request, 選擇 GET 方式,網址為: http//:127.0.0.1:5000/item/banana
- Send 發送
- 確認查看單一品項 API 是正常
- 出現 banana 品項結果
程式碼解析
-
單一品項查詢
- 透過 GET 方式並於路由指定品項,
- 使用 filter 方式篩選出指定的品項
- 有找到則回傳該品項
- 如果未篩選到則回傳 404
class Item(Resource):
# 單一品項查詢
def get(self, name):
item = next(filter(lambda x: x['name'] == name, items), None)
return {'item': item}, 200 if item else 404
-
單一品項建立
- 透過 POST 方式並於路由指定品項
- 使用 filter 方式篩選出指定的品項
- 有找到則回傳該品項已經存在,不必創建
- 如果未找到,則解析客戶端的body
- 並將創建的品項加入 items 陣列內
class Item(Resource):
# 建制新品項
def post(self, name):
# 如果該品項已經存在 items 內,就找出並回傳給客戶端該品項已經存在
if next(filter(lambda x: x['name'] == name, items), None):
return {'message': f'An item with name {name} already exists ..'}, 403
# 如果該品項不存在,則解析客戶端傳來的body,並將其品項寫入 items
data = request.get_json()
item = {'name': name, 'price': data['price']}
items.append(item)
return item, 201
One Comment