簡單參數
1. 原始方式獲取請求參數
Controller方法形參中聲明httpServletRequest對象
調用對象的getParameter參數名
@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name = request.getParameter("name");String ageStr = request.getParameter("age");int age = Integer.parseInt(ageStr);System.out.println(name+" "+age);return "OK";}}
2.SpringBoot中接受簡單參數
請求參數名與方法形變量名相同
自動進行類型轉換
@RestController
public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name,Integer age){System.out.println(name+" "+age);return "OK";}}
3.RequestParam注解
如果遇到參數名稱不匹配的問題,可以用@RequestParam進行映射
注意,當啟用了RequestParam,你需要知道RequestParam的required屬性默認是true,代表請求參數必須傳遞,如果不傳遞可能會報錯
防止報錯,可以將required=false;
@RestController
public class RequestController {@RequestMapping("/simpleParam2")public String simpleParam2(@RequestParam(name="name")String username, Integer age){System.out.println(username+" "+age);return "OK";}
}
測試
我測試的工具是用的Postman,走Get和Post都可以
GET,在響應頭上傳遞參數
在這里插入圖片描述
POST,在響應體上傳遞參數
實體參數
請求規則:請求參數名與形參對象屬性名稱保持相同,即可直接通過POJO接收。
1.簡單實體對象
簡單參數定義一個兩個還好(比如我定義用戶名、密碼),但是如果針對用戶信息存在比較密集的參數,可能不太容易進行響應和請求。
為了解決這個問題,可以把信息都封裝到實體參數中。
首先我們需要在java中做好封裝,我們在com.ztt.Pojo包下封裝一個User類,其中實現好私有變量的Get和Set方法以及toString方法。
package com.ztt.Pojo;public class User {private String name;private Integer age;public void setName(String name){this.name = name;}public void setAge(Integer age){this.age = age;}public Integer getAge(){return this.age;}public String getName(){return this.name;}@Overridepublic String toString(){return "User{"+"name="+name+"age="+age;}}
在RequestController中定義好方法
import com.ztt.Pojo.User; //記得給User引用@RestController
public class RequestController {@RequestMapping("/simplePojo")public String simplePojo(User user){System.out.println(user);return "OK";}}
調試通過
2.復雜實體對象
我們這個實體對象不僅有String和Integer,還引入一個address.
首先新建Address類,包含了私有變量city和province,以及對應的set、get和toString方法。
package com.ztt.Pojo;public class Address {private String city;private String province;public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}@Overridepublic String toString() {return "Address{" +"city='" + city + '\'' +", province='" + province + '\'' +'}';}
}
在User類中新加入Address以及其相關的set和get方法
package com.ztt.Pojo;public class User {private String name;private Integer age;private Address address;public void setName(String name){this.name = name;}public void setAge(Integer age){this.age = age;}public Integer getAge(){return this.age;}public String getName(){return this.name;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +", address=" + address +'}';}
}
在RequestController中定義請求方法(其實和簡單實體參數的請求一樣、基本上不用變)
import com.ztt.Pojo.User; //記得給User引用@RestController
public class RequestController {@RequestMapping("/complexPojo")public String complexPojo(User user){System.out.println(user);return "OK";}}
利用Postman發送請求(返回OK)
數組參數
使用場景:比如使用多選框進行多目標選取。
接收方式可以采用數組接受,也可以選擇集合接受。
@RestController
public class RequestController {// 數組進行集合的封裝@RequestMapping("/arrayParam")public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return "OK";}// 利用集合進行參數的封裝// 使用集合封裝時,需要采用@RequestParam對形參定義,因為默認集合是封裝到數組類型中的@RequestMapping("/listParam")public String arrayParam(@RequestParam List<String> hobby){System.out.println(hobby);return "OK";}
}
日期參數
由于日期記錄的形式比較豐富,所以在日期參數傳遞的過程中,需要使用@Dat 注解進行日期參數格式轉換。
import java.time.LocalDateTime;@RestController
public class RequestController {
@RequestMapping("/dateParam")public String dateParam(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}
}
注:如果時間格式不匹配就會出現這樣的錯誤:
Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘java.time.LocalDateTime’; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDateTime] for value [2023-8-11 10:06:54]; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2023-8-11 10:06:54]]
JSON參數
JSON參數中JSON數據鍵名與形參對象屬性名保持一致,定義POJO類型形參可以接受參數,同時需要使用@RequestBody標識。
@RestController
public class RequestController {@RequestMapping("/jsonParam")public String jsonParam(@RequestBody User user){System.out.println(user);return "OK";}
}
POST中數據體
{
“name”:“張三”,
“age”:10,
“address”:{
“province”:“beijing”,
“city”:“北京”
}
}
Postman中發送格式
路徑參數
路徑參數的請求直接通過URL傳遞參數
在java中可以通過占位符{…}來標識路徑參數,通過@PathVariable獲取路徑參數.
使用寫死的方法也可以,只不過占位符的方法更靈活一些。
@RestController
public class RequestController {// 簡單參數請求@RequestMapping("/path/{id}")public String urlParam(@PathVariable Integer id){System.out.println(id);return "OK";}// 復雜參數請求@RequestMapping("/path/{id}/{name}")public String urlParam2(@PathVariable Integer id,@PathVariable String name){System.out.println(id);System.out.println(name);return "OK";}
}
請求方式可以直接在瀏覽器輸入路徑
http://localhost:8080/path/100
http://localhost:8080/path/1/Tom
(PS:用postman發送也可以)