在 API 設計中驗證用戶發送的引數的最佳實踐是什么?通過引數驗證,我指的是:檢查所需的引數是否已發送,確保它們具有正確的格式等等……這里有幾個簡單的示例來驗證id已發送的引數。以 Python 使用 Flask 來說明:
A) 在控制器內的路由定義中添加驗證邏輯。
@api.route('/job', methods=['GET'])
def get_jobs():
try:
if params["id"] is None:
raise Exception("Invalid param ID parameters.")
job = job_manager.get_job(params["id"])
return jsonify(job)
B) 在應用程式的核心。這是業務層,其中應用邏輯來轉換資料。
class JobManager:
def get_job(self, job_id) -> None:
if job_id is None:
raise Exception("Invalid param ID parameters.")
在更復雜的場景中validator,可以使用服務或裝飾器,但問題是相同的:代碼的哪個點是驗證用戶輸入的最佳實踐。
如果答案不是上述任何一種情況(或兩者兼有),請提供有關您的答案的更多詳細資訊。如果可能,請嘗試成為語言不可知論者,因為我正在尋找可以在任何地方應用的最佳實踐。
uj5u.com熱心網友回復:
通常,我將驗證分為幾個階段:
- REST 控制器中輸入資料的即時語法驗證
- 服務中的業務邏輯驗證
第一次驗證應該只標記絕對錯誤的東西;例如,缺少必填欄位、型別不匹配、無法決議的字串、任何代碼注入嘗試以及安全令牌的存在(或缺乏)。
當這個驗證通過時,輸入資料至少在語法上是正確的,并且可以傳遞給服務,在那里進行更嚴格的驗證;即輸入資料是否對業務有意義,具有該 ID 的資源是否存在 - 等等。
簡短版本:第一次驗證查找明顯錯誤的內容,而以下驗證確保輸入資料正確且對業務有意義。
uj5u.com熱心網友回復:
作為一項規則,決議應該發生在資訊進入系統的那一點,或者盡可能接近該點。
因此肯定是“應用層”而不是“域層/業務層”:要么由控制器本身呼叫,要么非常接近它。(通常不“在”控制器中,因為您應該能夠測驗決議器而無需耦合到一堆 HTTP 儀式。)
@api.route('/job', methods=['GET'])
def get_jobs():
try:
job_id = parse_job_id(params["id"])
job = job_manager.get_job(job_id)
return jsonify(job)
在型別化語言中,這可以讓你的生活更輕松,因為你大大減少了你必須問“這個通用資料結構是否有我期望的資訊?”的地方的數量。
另一方面,檢查業務策略通常屬于域層。
例如:如果您的 API 需要日期,則檢查日期是否實際存在,以及日期是否以適當的 ISO-8601 格式表示,等等......這些型別的檢查都作為決議的一部分發生控制器的輸入。
另一方面,檢查日期是否“在未來”,或者日期是否在保修范圍內,或者……這些檢查屬于您的域代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329239.html
