在Spring Boot Web應用程式中,伺服器會處理各種不同的請求類型,並從這些請求中提取資料或參數。本篇文章將深入探討Spring Boot如何處理HTTP請求以及解析不同形式的請求參數,例如URL參數、Query String、Form Data、JSON物件等等。
URL參數
當使用者透過網頁瀏覽器或其他客戶端發送一個HTTP GET請求時,通常會包含一組名值對的URL參數。這些參數可以輕易地存取到並且用於控制器方法中。以下是如何使用@PathVariable注解來存取URL參數的範例:
// 在Controller內部定義的方法上使用 @PathVariable 注解
@GetMapping("/greeting/{name}")
public Greeting greeting(@PathVariable("name") String name) {
return new Greeting(1L, "Hello, " + name);
}
在此範例中,`{name}`是一種變量模板,它告訴Spring框架從URL中匹配相應的路徑片段並將其作為參數傳遞給方法。這樣就可以在控制器方法中直接使用這個參數了。
Query Strings
Query strings是在URL後面附加的一串以?分隔的字串,其中包含了更多關於請求的資訊。Query string中的每個項目都是由一個key-value pair所構成的,並且用&字符分隔開來。以下是從HTTP request中獲取query string參數的方法:
// 在Controller內部定義的方法上使用 @RequestParam 注解
@GetMapping("/search")
public List<Product> search(@RequestParam("q") String query) {
// q is the key for the query parameter in the query string
return productRepository.findByNameContaining(query);
}
這裡使用了`@RequestParam`注解來指示Spring從query string中提取出特定關鍵字(在本例中為”q”)的值並提供給控制器方法。
Form Data
對於HTML表單提交的資料,通常是通過form data的形式進行傳輸的。當用戶提交一個含有input元素的表單時,這些輸入的內容就會被轉換為key-value pairs並一起打包進同一個HTTP請求體中。要從這種形式中獲取數據,可以使用`@ModelAttribute`或者`@RequestBody`注解:
// 使用 @ModelAttribute 來映射表單資料到模型物件
public class CreateUserForm {
private String firstName;
private String lastName;
// getters and setters omitted for brevity
}
@PostMapping("/users")
public User createUser(@ModelAttribute CreateUserForm form) {
// 将表单数据转换为User对象
CreateUserForm form = new CreateUserForm(); // 初始化表单数据
form.setFirstName(request.getParameter("first_name"));
form.setLastName(request.getParameter("last_name"));
// 处理表单数据
// 创建用户
User user = new User();
user.setFirstName(form.getFirstName());
user.setLastName(form.getLastName());
userService.save(user);
// 返回一个成功的响应
return user;
}
在上述示例中,我們首先創建了一個用於表示表單資料的DTO物件(`CreateUserForm`),然後使用`@ModelAttribute`注解將表單資料映射到該物件中。Spring MVC會自動將HTTP請求中的資料與我們的DTO物件的屬性進行配對。如果需要更靈活的控制,也可以直接使用`@RequestBody`注解來序列化和反序列化整個請求體:
@PostMapping("/users")
public void saveUser(@RequestBody User user) {
// 處理User實體
userService.save(user);
}
JSON Objects
隨著RESTful API的流行,很多時候我們都會收到帶有結構化的JSON資料的請求。為了能夠正確解析這些資料並將其轉換為 Java POJO (Plain Old Java Object),Spring提供了幾種方式來處理這類請求:
// 使用Jackson annotations來標記POJO的屬性和GET/SET方法
public class Customer {
@JsonProperty("id")
private int customerId;
private String name;
// Getter & Setter methods
}
// 在控制器方法中使用 @ResponseBody 和 @RequestBody 來讀寫JSON資料
@PostMapping("/customers")
public ResponseEntity<Void> addCustomer(@RequestBody Customer customer) {
customerService.add(customer);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
在上面的例子中,我們使用`@RequestBody`注解來指定控制器方法應該接受一個JSON格式的請求體,並將其轉換為`Customer`類型的參數。同樣地,`@ResponseBody`注解則是用來指示Spring將返回的Java物件轉換為JSON格式並放入HTTP回應中。
總結來說,Spring Boot提供了多種手段來處理HTTP請求並從中提取有用資訊。根據請求的不同特徵和使用場景,開發人員可以選擇適合的方式來設計控制器方法和參數。