Published on

「Spring Boot API 開發:從 0 到 1」Day 11 請求參數處理深入探討

上一篇我們已經建立了基本的 RESTful API 內容

今天我們將深入探討如何來處理各種類型的請求參數

Query String

查詢參數是 URL 中 ? 後面的鍵值對(key-value pair)

Spring Boot 提供了多種方式來處理這些參數

  • 基本用法
@GetMapping("/query01")
public String query01(String name) {
    return String.format("query string - %s", name);
}
  • 使用 @RequestParam
// 比較常用
@GetMapping("/query02")
public String query02(@RequestParam String name) {
    return String.format("query string - %s", name);
}
  • @RequestParam 註解提供了更多控制選項。例如,我們可以設置參數是否必填,以及提供默認值
@GetMapping("/query03")
public String query03(@RequestParam(required = false, defaultValue = "Guest") String name) {
    return String.format("query string - %s", name);
}

在這個例子中,name 參數不是必填的,如果沒有提供,將使用默認值 "Guest"

Path

路徑變數是 URL 路徑的一部分。使用 @PathVariable 註解來捕獲這些值:

@GetMapping("/path01/{name}")
public String path01(@PathVariable String name) {
    return String.format("path - %s", name);
}

同樣,我們可以設置路徑變數是否必填,不過,如果只是這樣設定的話,它是沒有意義的

因為這樣子的設定,path 一定是必填的,所以會發生 404 的錯誤

@GetMapping("/path02/{name}")
public String path02(@PathVariable(required = false) String name) {
    return String.format("path - %s", name != null ? name : "Unknown");
}

需要改成下面這種方式,它才有意義

@GetMapping({"/path03/{name}", "/path03"})
public String path03(@PathVariable(required = false) String name) {
    return String.format("path - %s", name != null ? name : "Unknown");
}

Spring Boot 也允許我們輕鬆獲取 Request Header 和 Cookie 的值:

@GetMapping("/header")
public String header(@RequestHeader(required = false) String name) {
    return String.format("header - %s", name);
}

@GetMapping("/cookie")
public String cookie(@CookieValue(required = false) String name) {
    return String.format("cookie - %s", name);
}

Form Data

對於 POST 請求中的表單資料,我們有多種處理方式:

@PostMapping("/form01")
public String form01(String title) {
    return String.format("form01 - %s", title);
}

@PostMapping("/form02")
public String form02(@RequestParam String title) {
    return String.format("form02 - %s", title);
}

// 比較常用
@PostMapping("/form03")
public String form03(Todo todo) {
    return String.format("form03 - %s", todo);
}

@PostMapping("/form04")
public String form04(@RequestParam Map<String, Object> map) {
    String title = map.get("title").toString();
    return String.format("form04 - %s", name);
}

Request Body

對於 JSON 格式的請求體,我們可以使用 @RequestBody 註解


// 比較常用
@PostMapping("/body01")
public String body01(@RequestBody Todo todo) {
    return String.format("body01 - %s", todo);
}

@PostMapping("/body02")
public String body02(@RequestBody Map<String, Object> map) {
    String title = map.get("title").toString();
    return String.format("body02 - %s", title);
}

File

對於檔案上傳,我們可以使用 MultipartFile

@PostMapping("/file")
public String file(@RequestParam("file") MultipartFile uploadFile) throws IOException {
    String filename = uploadFile.getOriginalFilename();
    String content = new String(uploadFile.getBytes(), StandardCharsets.UTF_8);
    return String.format("file name - %s, file content - %s", filename, content);
}

實踐建議

  • 始終為重要參數提供清晰的文件說明。
  • 合理使用必填參數和可選參數,提高 API 的靈活性。
  • 為可選參數提供合適的默認值,簡化 API 的使用。

總結

Spring Boot 提供了豐富的工具來處理各種類型的請求參數

通過使用 @PathVariable、@RequestParam、@RequestHeader、@CookieValue 和 @RequestBody 等註解,我們可以輕鬆地獲取和處理來自不同來源的數據

在處理參數時,我們可以設置參數是否必填(required 屬性),以及提供默認值(defaultValue 屬性), 這樣可以增加我們的 API 的靈活性和健壯性

記住,選擇正確的參數處理方式取決於你的 API 設計和具體需求。合理使用這些工具可以讓你的程式碼更加清晰、易於維護。

同步刊登於 iTHome 鐵人賽 「Spring Boot API 開發:從 0 到 1」Day 11 請求參數處理深入探討

圖片來源:AI 產生

參考連結