在Day 29:物聯網幽靈的RESTful API 謎題.芝麻開門中提到:用Flask
來建立一個RESTful API
,並且要按照「宿舍訪客名單 API 的需求規格」需求規格,用 Flask 跟 PyMongo
來實作API
,然後用Postman
來測試它的功能和效能。
這個程式碼的目的是建立一個宿舍訪客名單的網路服務,讓使用者可以透過網路來查詢、新增、修改或刪除訪客的資料。
這次的目標是實作以下內容:
我們在第29天中有提到,這就像是管理員要先定義好一些規則,例如:
- 如果有人要查詢或新增訪客資料,他們要用網址 http://192.168.1.100:5000/visitors 來跟管理員聯絡,並且告訴他們是要查詢(GET)還是新增(POST)。
- 如果有人要修改或刪除特定的訪客資料,他們要用網址 http://192.168.1.100:5000/visitors/ 來跟管理員聯絡,並且告訴他們是要修改(PUT)還是刪除(DELETE),以及要操作哪一筆資料(id)。
# 定義路由和 HTTP 方法,並使用 auth.login_required decorator要求驗證
@app.route("/visitors", methods=["GET", "POST"])
@auth.login_required
def visitors():
@app.route("/visitors", methods=["GET", "POST"])
:
‘/visitors’
允許的method
有什麼("GET", "POST"
)。GET
功能,也不能拿掉,因為GET
是預設,用在URL
,這樣才知道要去哪個網站、呈現哪個HTML
(長風青雲, 2019)。這就像是管理員要根據使用者的需求,從資料庫中找出相對應的訪客資料,並且回傳給使用者。
# 如果是 GET 方法,則取得所有或特定的訪客資料
if request.method == "GET":
# 取得查詢參數 name,如果沒有則預設為空字串
name = request.args.get("name", "")
# 如果有 name,則根據 name 查詢特定的訪客資料
if name:
visitor = mongo.db.visitors.find_one({"name": name})
# 如果找不到,則回傳 404 狀態碼和錯誤訊息
if visitor is None:
return jsonify({"status": 404, "message": "Visitor not found"}), 404
# 如果找到,則回傳 200 狀態碼和訪客資料
else:
return jsonify({"status": 200, "visitor": visitor}), 200
# 如果沒有 name,則取得所有的訪客資料
else:
visitors = mongo.db.visitors.find()
# 將查詢結果轉換為列表
visitors_list = list(visitors)
# 回傳 200 狀態碼和訪客列表
return jsonify({"status": 200, "visitors": visitors_list}), 200
if request.method == "GET":
:使用者使用GET時執行(從指定的資源請求數據)(Willis, 2022)
request.args.get('參數名稱')
:request.args
:args.get
:GET
參數值(peiiiii, 2022)
find_one({"name": name})
:之前在第18天時有提到,使用find_one指令呼叫查詢,就像是在圖書館裡找一本特定的書,會取得返回符合條件的第一筆資料。
{"Name": "kevin", "age": "18"}
:"status": 404
:404(not found)
是一種HTTP Status Code
,代表找不到請求的資源 (jim_chung, 2020)
"status": 200
:200(OK)
代表成功 (jim_chung, 2020)
find_one({"name": name})
:使用find呼叫查詢時,如果沒有傳入任何資訊(沒有任何的篩選條件),就會把所有資料回傳(肯恩, 2020)
# 如果是 POST 方法,則新增一筆訪客資料
elif request.method == "POST":
# 取得請求中的 JSON 資料
data = request.get_json()
# 檢查 JSON 資料是否包含所有必要的欄位
if data and all(key in data for key in ["name", "age", "gender", "phone", "address"]):
# 執行 insert_one 新增訪客資料到 MongoDB 中
result = mongo.db.visitors.insert_one(data)
# 回傳 201 狀態碼和新增的訪客 id
return jsonify({"status": 201, "id": str(result.inserted_id)}), 201
# 如果 JSON 資料不完整,則回傳 400 狀態碼和錯誤訊息
else:
return jsonify({"status": 400, "message": "Missing or invalid data"}), 400
if request.method==’POST’:
:request.get_json()
:["name", "age", "gender", "phone", "address"]
:insert_one
:在MongoDB指令(1)中有提到,使用insert_one指令,就像是在圖書館中增加一本新書,要填寫欄位名稱和對應的值等。201狀態碼
:是一種HTTP Status Code
,代表已建立
( Hypertext Transfer Protocol: Response Status Codes)。400狀態碼
:是一種HTTP Status Code
,代表錯誤的請求
( Hypertext Transfer Protocol: Response Status Codes)。撰寫Flask Web來存取Mongo DB (1)討論如何實作以下內容:
撰寫Flask Web來存取Mongo DB (2)討論如何實作以下內容:
撰寫Flask Web來存取Mongo DB (3)討論如何實作以下內容: