隨著 API 的開發,我們會越來越需要頻繁地測試我們所寫的 API,而在過去這幾天我們測試API的方法,都是直接用瀏覽器進行測試,雖然不用額外安裝軟體,流程也很簡單 (打開瀏覽器輸入網址就好),但同時也有著巨大的限制,那就是
「只能打 GET 的 API」
除此之外,要在網址列來回調整路由、參數也不容易,因此接下來我們要來介紹一個測試 API 的工具 — Postman
POSTMAN 是一個強大的開發工具,用於簡化API測試和管理。它提供了一個直觀的用戶界面,讓開發人員輕鬆創建、測試和調試API請求。POSTMAN允許您快速構建各種HTTP請求,包括GET、POST、PUT和DELETE等,並且可以輕鬆設置諸如標頭、參數、身份驗證等請求屬性。此外,POSTMAN還提供了集成的自動化測試工具,讓您輕鬆創建測試腳本,執行集成測試和性能測試。POSTMAN的集合功能允許您組織和共享API請求和測試集,並支持團隊協作。總之,POSTMAN是一個不可或缺的工具,有助於簡化API開發和測試流程,提高效率並確保API的可靠性。
上面這段說的沒錯,基本上後端 API 開發都會用到它,使用起來也很容易~
(請讓我偷懶省略基本介紹XD)
進到 Postman 官網 後,在左下方就可以找到桌面版的下載按鈕,大家只要選擇自己的作業系統就可以開始下載安裝檔了。
除了桌面版,Postman 在今年也釋出了 VS code 擴充程式版,常用的功能都有支援,操作上也幾乎都一樣,如果你本來就有在使用 VS code 的進行開發,可以把這個版本納入考量
首先,建立一個新的 collection (這邊是以 ironman 為例,其他則是我自己過去開發時建立的,請忽略XD)
接下來,點擊「...」內的「Add request」
就成功建立一個空白的 request 了 (預設叫 New Request)
接下來,在輸入框內輸入要測試的網址 http://127.0.0.1:8000/items
(這邊繼續沿用昨天最後的程式),按下「Send」後,就可以在下方看到回傳的結果了
如果要添加參數,在下方的 Params 的表格內輸入參數,同時你也會發現,上方的網址會自動發生調整成正確的格式,最後送出後,就可以看到新的結果了 (昨天一樣)
若要測試其他 HTTP 方法,則透過輸入框左邊的下拉選單進行選擇就好~
接下來我們來設定用 POST 搭配 FormData 的路由
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
需要再安裝一個 python 套件:python-multipart
pip install python-multipart
在上面的程式中,我們要求要有兩個參數,分別是 username
和 password
,型別都是字串,並且指定它是 Form 物件。此時,我們就可以用 FormData 的方式送參數到後端了。
注意!沒有指定是 Form 物件的話,FastAPI 會認定是 Query Parameter
下面這個是沒有加參數的情況
得到了 422 的錯誤,這是因為 FastAPI 檢查是否帶有參數時,發現不符合,因此就回傳預設的錯誤訊息 (告知少了什麼欄位)
接下來讓我們來添加這兩個必要參數
在下方的 Body 選擇 form-data
在表格內輸入參數後送出,就可以看到正確的回應了
早期還有另一種寫法 (但不建議)
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/login")
async def login(request: Request):
_form = await request.form()
username = _form["username"]
password = _form["password"]
return {"username": username}
它也可以拿到上面的正確回應,但它沒有有效地使用 FastAPI 內建的型別檢查,因此當有缺少欄位時,會是在 username = _form["username"]
這行才出錯,也因此,被判定為 500 的錯誤
這會造成開發時的 debug 的難度提高,同時前端也會完全不知道發生什麼事,只知道後端出錯了
如果不喜歡 FormData,也可以選擇使用 JSON 格式,但程式碼要做點調整
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
username: str
password: str
@app.post("/login")
async def login(user: User):
return {"username": user.username}
在下方的 Body 選擇 raw,並切換成 JSON 格式,並輸入這段 JSON 後送出
{
"username": "ithome",
"password": "ironman"
}
就可以得到正確回應了
如果有少欄位,則會收到 422 錯誤
今天就介紹的這邊了,上面我們介紹了
大家可以思考一下比較喜歡哪種做法XD
明天會開始介紹面對越來越多的 API,該怎進行管理,以及專案架構應該怎麼設計~