目錄
- 請求響應
- 請求
- Postman 工具
- 簡單參數請求
- 實體參數請求
- 數組集合參數
- 日期參數
- JSON 參數
- 路徑參數
- 響應
請求響應
請求
Postman 工具
Postman 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件
作用:常用于進行接口測試
簡單參數請求
-
原始方式
在原始的 Web 程序中,獲取請求參數,需要通過 HttpServletRequest 對象手動獲取(繁瑣,手動類型轉換)
import jakarta.servlet.http.HttpServletRequest; import org.springframework.boot.autoconfigure.graphql.GraphQlProperties; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@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:"+name+" age:"+age);return "success";} }
用 GET 請求在 Postman 中輸入對應的 API 并設置參數,點擊發送
后端服務器接收數據成功顯示“success”。
-
Spring Boot 方式
簡單參數:參數名與形參變量名相同,定義形參即可接收參數
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(String name, Integer age){// 獲取請求參數System.out.println("name:"+name+" age:"+age);return "success";} }
用 POST 請求則是在 Postman 中輸入對應的 API,在響應體中設置參數,點擊發送
后端服務器接收數據成功顯示“success”。
-
如果方法形參名稱與請求參數名稱不匹配,可以使用 @RequestParam 完成映射
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;@RestController public class RequestController {@RequestMapping("/simpleParam")public String simpleParam(@RequestParam(name="name")String username, Integer age){// 獲取請求參數System.out.println("name:"+username+" age:"+age);return "success";} }
注意:用 @RequestParam 映射的參數必須傳遞,不傳遞則會報錯,因為參數的 required 屬性默認是 true
public String simpleParam(@RequestParam(name="name", required=true)String username, Integer age)
如果將 true 改為 false,不傳遞也不會報錯
實體參數請求
-
簡單實體對象:請求參數名與形參對象屬性名相同,定義 POJO 接收即可
假設前端傳遞 name 和 age 兩個參數,則實體類可以定義為:public class User {private String name;private Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';} }
請求參數的方法為:
@RequestMapping("/simplePojo") public String simplePojo(User user){// 獲取請求參數System.out.println(user);return "success"; }
-
復雜實體對象:請求參數名與形參對象屬性名相同,按照對象層次結構關系即可接收嵌套 POJO 屬性參數
有個實體類 User 定義如下
public class User {private String name;private Integer age;private Address address; }
其中嵌套著另一個實體類 Address,定義如下:
public class Address {private String province;private String city; }
如果說要傳遞值,則為
address.province=guangdong
和address.city=guangzhou
數組集合參數
-
數組參數:請求參數名與形參數組名稱相同且請求參數為多個,定義數組類型形參即可接收參數
請求數組參數方法為:
@RequestMapping("/arrayParam") public String arrayParam(String[] names){// 獲取請求參數System.out.println(Arrays.toString(names));return "success"; }
傳遞參數時只需要一個一個傳就可以了
控制臺獲取到數組參數
-
集合參數:請求參數名與形參集合名稱相同且請求參數為多個,用 @RequestParam 綁定參數關系
請求集合參數的方法為
@RequestMapping("/listParam") public String listParam(@RequestParam List<String> names){// 獲取請求參數System.out.println(names);return "success"; }
傳遞參數與數組參數一樣
日期參數
-
日期參數:使用 @DateTimeFormat 注解完成日期參數格式轉換
請求參數的方法為:
@RequestMapping("/dateParam") public String dateParam(@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){// 獲取請求參數System.out.println(updateTime);return "success"; }
注意:如果月份是個位數,要在前面加 0 才能成功傳遞參數
JSON 參數
JSON 參數:JSON 數據鍵名與形參對象屬性名相同,定義 POJO 類型形參即可接收參數,需要使用 @RequestBody 標識
請求參數的方法為:
@RequestMapping("/jsonParam")
public String jsonParam(@RequestBody User user){// 獲取請求參數System.out.println(user);return "success";
}
傳遞參數給后端要按照 JSON 格式,并且實體類中的變量名要與請求參數 JSON 中的一致
路徑參數
路徑參數:通過請求 URL 直接傳遞參數,使用 {…} 來標識該路徑參數,需要使用 @PathVariable 獲取路徑參數
@RequestMapping("/path/{id}") // path后面的id不能寫死,應該動態的獲取
public String pathParam(@PathVariable Integer id){// 獲取請求參數System.out.println(id);return "success";
}
傳遞參數的時候就不用設置參數值了,直接填寫 URL 即可
如果要用多個路徑參數,只需在前一個后面加上”/參數名“即可
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id, @PathVariable String name){// 獲取請求參數System.out.println(id + " " + name);return "success";
}
響應
服務端在方法或者類上添加 @ResponseBody 來以 JSON 格式響應返回結果
關于服務端的響應部分其實在請求部分就有涉及,每當請求發送成功后,服務端都會返回一個“success”,但是在之前的代碼中并沒有 @ResponseBody 注解,這是因為 @RestController = @Controller + @ResponseBody,也就是說用只需添加 @RestController 即可。
由于返回的數據類型不同,響應格式也有差異
@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {return "Hello World~";}@RequestMapping("/getAddress")public Address getAddress() {Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");return ad;}@RequestMapping("/getAddresses")public List<Address> getAddresses() {List<Address> list = new ArrayList<>();Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");Address ad2 = new Address();ad2.setProvince("廣西");ad2.setCity("桂林");list.add(ad);list.add(ad2);return list;}
}
響應的格式有字符串、JSON 格式、JSON格式的數組
這樣響應的格式不規范,不便管理和維護,所以要創建一個響應結果封裝類來統一響應結果
/*
* 統一響應結果封裝類
*/
public class Result {private Integer code; // 狀態碼,200為成功,500為失敗private String message; // 返回消息private Object data; // 返回數據public Result(Integer code, String message, Object data) {this.code = code;this.message = message;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public static Result success(Object data) {return new Result(200, "success", data);}public static Result success() {return new Result(200, "success", null);}public static Result error(String message) {return new Result(500, message, null);}@Overridepublic String toString() {return "Result{" +"code=" + code +", message='" + message + '\'' +", data=" + data +'}';}
}
將原來的方法改為:
@RestController
public class HelloController {@RequestMapping("/hello")public Result hello() {return Result.success("hello world");}@RequestMapping("/getAddress")public Result getAddress() {Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");return Result.success(ad);}@RequestMapping("/getAddresses")public Result getAddresses() {List<Address> list = new ArrayList<>();Address ad = new Address();ad.setProvince("廣東");ad.setCity("深圳");Address ad2 = new Address();ad2.setProvince("廣西");ad2.setCity("桂林");list.add(ad);list.add(ad2);return Result.success(list);}
}
如此一來,響應格式就全部統一了