您好,登錄后才能下訂單哦!
本篇內容介紹了“SpringBoot獲取前臺參數的方式及統一響應的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
SpringBoot接受前臺參數的六種方式,首先因為從前臺發送的請求沒有界面的話只能是從地址欄發送并且只能是Get請求,為了測試其他的請求,所以我們使用一個工具->Postman,Postman是一款功能強大的網頁調試與發送網頁HTTP請求的Chrome插件。
對于前臺傳過來的參數大致分為六種,下面一個一個的做演示學習:演示之前先復習一下,沒用SpringBoot獲取前臺參數的方式,通過request對象獲取。
@RestController public class RequestController { //原始方式 @RequestMapping("/simpleParam") public String simpleParam(HttpServletRequest request){ // http://localhost:8080/simpleParam?name=Tom&age=10 // 請求參數: name=Tom&age=10 (有2個請求參數) // 第1個請求參數: name=Tom 參數名:name,參數值:Tom // 第2個請求參數: age=10 參數名:age , 參數值:10 String name = request.getParameter("name");//name就是請求參數名 String ageStr = request.getParameter("age");//age就是請求參數名 int age = Integer.parseInt(ageStr);//需要手動進行類型轉換 System.out.println(name+" : "+age); return "OK"; } }
在Springboot的環境中,對原始的API進行了封裝,接收參數的形式更加簡單。 如果是簡單參數,參數名與形參變量名相同,定義同名的形參即可接收參數。
@RestController public class RequestController { // http://localhost:8080/simpleParam?name=Tom&age=10 // 第1個請求參數: name=Tom 參數名:name,參數值:Tom // 第2個請求參數: age=10 參數名:age , 參數值:10 //springboot方式 @RequestMapping("/simpleParam") public String simpleParam(String name , Integer age ){//形參名和請求參數名保持一致 System.out.println(name+" : "+age); return "OK"; } }
如果后臺需要但是前臺并沒傳對應的參數,這個時候會返回 null
當前臺傳的參數名和后臺接受參數的方法形參列表不一致的時候,可以通過@RequestParam(“ ”)來指定
@RestController public class RequestController { // http://localhost:8080/simpleParam?name=Tom&age=20 // 請求參數名:name //springboot方式 @RequestMapping("/simpleParam") public String simpleParam(@RequestParam("name") String username , Integer age ){ System.out.println(username+" : "+age); return "OK"; } }
另外@RequestParam中的required屬性默認為true(默認值也是true),代表該請求參數必須傳遞,如果不傳遞將報錯,如果該參數是可選的,可以將required屬性設置為false
代碼如下:
@RequestMapping("/simpleParam") public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){ System.out.println(username+ ":" + age); return "OK"; }
這個注解還有一個參數,是defaultValue表示如果前臺沒有傳遞參數就默認為當前指定的值。
@RequestMapping("/simpleParam") public String simpleParam(@RequestParam(name = "name", required = false,defaultValue ="匿名用戶") String userName, Integer age) { // 打印輸出 System.out.println(userName+"----"+age); return "ok"; }
簡單實體對象:
在使用簡單參數做為數據傳遞方式時,前端傳遞了多少個請求參數,后端controller方法中的形參就要書寫多少個。如果請求參數比較多,通過上述的方式一個參數一個參數的接收,會比較繁瑣。
此時,我們可以考慮將請求參數封裝到一個實體類對象中。 要想完成數據封裝,需要遵守如下規則:請求參數名與實體類的屬性名相同
要求是前臺傳過來的參數必須和對象中的參數名稱相同,順序相同。
@RestController public class RequestController { // http://localhost:8080/simpleParam?name=Tom&age=20 //實體參數:簡單實體對象 User有兩個屬性,一個是name 一個是age,這樣Spring就會自動完成賦值 @RequestMapping("/simplePojo") public String simplePojo(User user){ System.out.println(user); return "OK"; } }
復雜實體對象:對象套對象
比如說User中又多了一個字段: Address 而這個類又有兩個屬性,這個時候前臺傳遞參數的時候就需要發生改變,后臺還是用User接受
public class User { private String name; private Integer age; private Address address; //地址對象 ..... } public class Address { private String province; private String city; ..... }
方法代碼
@RestController public class RequestController { //實體參數:復雜實體對象 @RequestMapping("/complexPojo") public String complexPojo(User user){ System.out.println(user); return "OK"; } }
數組集合參數的使用場景:在HTML的表單中,有一個表單項是支持多選的(復選框),可以提交選擇的多個值。
xxxxxxxx?hobby=game&hobby=java
后端程序接收上述多個值的方式有兩種:
數組
集合
數組參數:請求參數名與形參數組名稱相同且請求參數為多個,定義數組類型形參即可接收參數
@RestController public class RequestController { //數組集合參數 @RequestMapping("/arrayParam") public String arrayParam(String[] hobby){ System.out.println(Arrays.toString(hobby)); return "OK"; } }
集合參數:請求參數名與形參集合對象名相同且請求參數為多個,@RequestParam 綁定參數關系
默認情況下,請求中參數名相同的多個值,是封裝到數組。如果要封裝到集合,要使用@RequestParam綁定參數關系
Controller方法:
@RestController public class RequestController { //數組集合參數 @RequestMapping("/listParam") public String listParam(@RequestParam List<String> hobby){ System.out.println(hobby); return "OK"; } }
上述演示的都是一些普通的參數,在一些特殊的需求中,可能會涉及到日期類型數據的封裝(其實我們一般都存字符串,不會轉來轉去,所以這里了解)。比如,如下需求:
因為日期的格式多種多樣(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么對于日期類型的參數在進行封裝的時候,需要通過@DateTimeFormat注解,以及其pattern屬性來設置日期的格式。
@DateTimeFormat注解的pattern屬性中指定了哪種日期格式,前端的日期參數就必須按照指定的格式傳遞。
后端controller方法中,需要使用Date類型 LocalDateT或LocalDateTime類型,來封裝傳遞的參數。
Controller方法:
@RestController public class RequestController { //日期時間參數 @RequestMapping("/dateParam") public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){ System.out.println(updateTime); return "OK"; } }
在學習前端技術時,我們有講到過JSON,而在前后端進行交互時,如果是比較復雜的參數,前后端通過會使用JSON格式的數據進行傳輸。 (JSON是開發中最常用的前后端數據交互方式) ,其實我們也會看到, 后臺如果返回給前臺數據的時候,有的是字符串,又的是集合,有的是JSON, 那么前臺在解析的時候就十分的麻煩, 后來經過一個實體類用來存放所有的數據, 然后返回這個對象, 這樣前臺在接受的時候只要處理JSON就好.在筆記的最后會提到
下面介紹在Postman中怎么發送JSON數據:
服務端Controller方法接收JSON格式數據:
傳遞json格式的參數,在Controller中會使用實體類進行封裝。
封裝規則:JSON數據鍵名與形參對象屬性名相同,定義POJO類型形參即可接收參數。需要使用 @RequestBody標識。
@RequestBody注解:將JSON數據映射到形參的實體類對象中(JSON中的key和實體類中的屬性名保持一致)
通過添加@RequestBody注解Spring可以自動的將JSON轉換為對象.
實體類:
public class User { private String name; private Integer age; private Address address; //省略GET , SET 方法 }
@RestController public class RequestController { //JSON參數 @RequestMapping("/jsonParam") public String jsonParam(@RequestBody User user){ System.out.println(user); return "OK"; } }
傳統的開發中請求參數是放在請求體(POST請求)傳遞或跟在URL后面通過?key=value的形式傳遞(GET請求)。
在現在的開發中,經常還會直接在請求的URL中傳遞參數。例如:
http://localhost:8080/user/1
http://localhost:880/user/1/0
上述的這種傳遞請求參數的形式呢,我們稱之為:路徑參數。
學習路徑參數呢,主要掌握在后端的controller方法中,如何接收路徑參數。
路徑參數:
前端:通過請求URL直接傳遞參數
后端:使用{…}來標識該路徑參數,需要使用@PathVariable獲取路徑參數
Controller方法:
@RestController public class RequestController { //路徑參數 @RequestMapping("/path/{id}") public String pathParam(@PathVariable Integer id){ System.out.println(id); return "OK"; } }
傳遞多個路徑參數:
@RestController public class RequestController { //路徑參數 前臺路徑 xxxx/path/12/jack @RequestMapping("/path/{id}/{name}") public String pathParam2(@PathVariable Integer id, @PathVariable String name){ System.out.println(id+ " : " +name); return "OK"; } }
響應:
前面我們學習過HTTL協議的交互方式:請求響應模式(有請求就有響應)
那么Controller程序呢,除了接收請求外,還可以進行響應。先說一下使用到的注解:
@ResponseBody
類型:方法注解、類注解
位置:書寫在Controller方法上或類上
作用:將方法返回值直接響應給瀏覽器
如果返回值類型是實體對象/集合,將會轉換為JSON格式后在響應給瀏覽器
在我們前面所編寫的controller方法中,都已經設置了響應數據。看一下類的注解@RestController, 這個注解是一個復合注解,里面包括了 @ResponseBody
結論:在類上添加@RestController就相當于添加了@ResponseBody注解。
類上有@RestController注解或@ResponseBody注解時:表示當前類下所有的方法返回值做為響應數據方法的返回值,如果是一個POJO對象或集合時,會先轉換為JSON格式,在響應給瀏覽器
下面我們來測試下響應數據:
@RestController public class ResponseController { //響應字符串 @RequestMapping("/hello") public String hello(){ System.out.println("Hello World ~"); return "Hello World ~"; } //響應實體對象 @RequestMapping("/getAddr") public Address getAddr(){ Address addr = new Address();//創建實體類對象 addr.setProvince("廣東"); addr.setCity("深圳"); return addr; } //響應集合數據 @RequestMapping("/listAddr") public List<Address> listAddr(){ List<Address> list = new ArrayList<>();//集合對象 Address addr = new Address(); addr.setProvince("廣東"); addr.setCity("深圳"); Address addr2 = new Address(); addr2.setProvince("陜西"); addr2.setCity("西安"); list.add(addr); list.add(addr2); return list; } }
在服務響應了一個對象或者集合,那私前端獲取到的數據是什么樣子的呢?我們使用postman發送請求來測試下。測試效果如下:
可能大家會發現,我們在前面所編寫的這些Controller方法中,返回值各種各樣,沒有任何的規范。
如果我們開發一個大型項目,項目中controller方法將成千上萬,使用上述方式將造成整個項目難以維護。那在真實的項目開發中是什么樣子的呢?
在真實的項目開發中,無論是哪種方法,我們都會定義一個統一的返回結果。方案如下:
這樣前端只需要按照統一格式的返回結果進行解析(僅一種解析方案),就可以拿到數據。
統一的返回結果使用類來描述,在這個結果中包含:
響應狀態碼:當前請求是成功,還是失敗
狀態碼信息:給頁面的提示信息
返回的數據:給前端響應的數據(字符串、對象、集合)
定義在一個實體類Result來包含以上信息。代碼如下:
public class Result { private Integer code;//響應碼,1 代表成功; 0 代表失敗 private String msg; //響應碼 描述字符串 private Object data; //返回的數據 public Result() { } public Result(Integer code, String msg, Object data) { this.code = code; this.msg = msg; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } //增刪改 成功響應(不需要給前端返回數據) public static Result success(){ return new Result(1,"success",null); } //查詢 成功響應(把查詢結果做為返回數據響應給前端) public static Result success(Object data){ return new Result(1,"success",data); } //失敗響應 public static Result error(String msg){ return new Result(0,msg,null); } }
改造后的Controller:統一返回Result
@RestController public class ResponseController { //響應統一格式的結果 @RequestMapping("/hello") public Result hello(){ System.out.println("Hello World ~"); //return new Result(1,"success","Hello World ~"); return Result.success("Hello World ~"); } //響應統一格式的結果 @RequestMapping("/getAddr") public Result getAddr(){ Address addr = new Address(); addr.setProvince("廣東"); addr.setCity("深圳"); return Result.success(addr); } //響應統一格式的結果 @RequestMapping("/listAddr") public Result listAddr(){ List<Address> list = new ArrayList<>(); Address addr = new Address(); addr.setProvince("廣東"); addr.setCity("深圳"); Address addr2 = new Address(); addr2.setProvince("陜西"); addr2.setCity("西安"); list.add(addr); list.add(addr2); return Result.success(list); } }
“SpringBoot獲取前臺參數的方式及統一響應的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。