關於請求參數取得對於開發 API 或是運行任何服務來說是相當重要,特別是我們需要根據使用者請求中所帶有的資訊進行後續的處理,所以這篇就來了解 Spring MVC 中主要用來取得參數的一些方法吧。
Spring Boot 常使用取得請求的方式有下面這些:
用法:
GET
用途:取得放在 URL 的參數
http:localhost:8080/test1?id=123
@RestController
public class RequestController {
@RequestMapping("/test1")
public String test1(@RequestParam Integer id,
@RequestParam(defaultValue = "Sean") String name,
@RequestParam(value = "nickname", required = false) String nickname
) {
System.out.println("id:" + id);
System.out.println("name:" + name);
System.out.println("name:" + nickname);
return "your request id is " + id + " and name is " + name + ", or you can called me " + nickname;
}
}
發送 request,帶入 id =1, name = Sean,故意不帶入第3個參數 nickname,可以看到最後會回傳 null 但也不會出錯誤,但如果把 required = true 就會出現 400 Bad Request 錯誤。
server console 上面顯示
用法:
POST
, PUT
用途:取得 Request body 裡面的參數(將 Json 轉為自定義 Java Object)
http:localhost:8080/test2
controller
@RequestMapping("/test2")
public String test2(@RequestBody Student student){
System.out.println("student id: " + student.getId() );
System.out.println("student name: " + student.getName() );
return "hello test2";
}
Student class
public class Student {
Integer id;
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
發送 request,帶入{ “id” =1, “name” = “Sean” }的 JSON 物件,如果請求內所帶的物件屬性不是Student 物件設定的,不管多或少其實都不會有問題,但如果希望參數設定可以驗證避免使用者傳錯參數的話,就必須要透過驗證註解像是@Valid
, @NotNull
, @NotBlank
等等的部分才可以做到了,這部分後續文章會有進一步說明。
server console 上面顯示
用法:
GET
, POST
用途:取得放在 requestHeader 的參數,可以用 GET 請求中設定 header; 如果用 POST 一般都會帶入 Content-Type = application/json
@RequestMapping("/test3")
public String test3(@RequestHeader String info,
@RequestHeader (name = "gogo", required = false) String gogo){
System.out.println("header info: " + info);
System.out.println("header gogo: " + gogo);
return "hello test3";
}
發送 request,header上面帶入指定的 header 名稱,如果是參數定義的就可以抓到
console 上面顯示
用法:
GET
, PUT
, DELETE
http://localhost:8080/test4/123/Sean
@RequestMapping("/test4/{id}/{name}")
public String test4(@PathVariable Integer id,
@PathVariable String name
){
System.out.println("path id: " + id);
System.out.println("path name: " + name);
return "hello test4";
}
發送 request,URL 上針對 {id}, {name} 部分帶入參數,後端就可以取得,注意定義的參數類型如果不匹配也會出現 400 bad request,像是如果你把 id 部分用文字帶入請求。
console 上面顯示
針對一些用法上大家可以注意一下
Http method | required | defaultValue | 常用情境 | |
---|---|---|---|---|
@RequestParam | GET |
O (預設true) | O | 查詢參數或表單數據 |
@RequestBody | POST , PUT |
O (預設true) | X | 處理 JSON 或 XML 請求 |
@PathVariable | GET , PUT , DELETE |
O (預設true) | X | URL 路徑中的變數 |
@RequestHeader | GET 、POST |
O (預設true) | O | 獲取 HTTP 請求header |
Ref:
相關文章也會同步更新我的部落格,有興趣也可以在裡面找其他的技術分享跟資訊。