簡體   English   中英

在 Spring Boot 中處理無效的 PathVariables

[英]Handling invalid PathVariables in Spring Boot

假設我有一個 GET 控制器 /api/product/{id} ,其中 id 是一個整數。 處理具有非整數 ID 的請求的最佳方法是什么? 目前 Spring 只是拋出一個 java.lang.NumberFormatException 並返回一個 400。

您可以進行路徑變量驗證,假設 id 應該是正整數值。

@GetMapping("/api/product/{id}")
public void getProduct(@PathVariable("id") @Min(value = 0) Integer id) {
    // ...
}

在此處閱讀以上請求驗證的更多信息

如果您知道產品 ID 具有一定范圍的 int 值,您甚至可以嘗試@Range

鑒於您聲明id是整數,400 響應似乎合適。

如果您反對 Spring 對它的處理,您可以始終將路徑變量設置為字符串,自己檢查數字,然后靜默地返回 400 或您想要的任何其他響應。

@GetMapping("/api/product/{id}")
public ResponseEntity<Product> getProduct(@PathVariable("id") String s) {
    try {
       int id = Integer.parseInt(s);
       // valid integer id here, do normal work ...
    }
    catch(NumberFormatException nfe) {
       return ResponseEntity.status(400).build(); // or whatever error code you want
    }
}

假設我有一個 GET 控制器 /api/product/{id} ,其中 id 是一個整數。 處理具有非整數 ID 的請求的最佳方法是什么?

如果/api/product/abcde是沒有當前表示的資源,那么您可能應該返回404 Not Found ,並在消息正文中解釋錯誤

狀態代碼是元數據,狀態代碼的目標受眾是理解“通過網絡傳輸文檔”域的通用組件。 在這里,您希望引起注意 target-uri 的拼寫,而 404 是這樣做的合適方法。

410 Gone可能是 404 的合理替代。

404 狀態代碼並不表示這種缺乏表示是暫時的還是永久的; 如果源服務器知道(大概是通過某種可配置的方式)該條件可能是永久性的,則 410(消失)狀態代碼比 404 更受歡迎。

410 響應的主要目的是通過通知接收者資源故意不可用以及服務器所有者希望刪除到該資源的遠程鏈接來協助 Web 維護任務。 這種事件對於限時促銷服務和屬於不再與源服務器站點關聯的個人的資源來說很常見。 沒有必要將所有永久不可用的資源標記為“消失”或將標記保留任何時間長度——這由服務器所有者自行決定。

請注意, 404410都是“默認可緩存的”,這可能是您在這種情況下想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM