SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗
Controller 中注解使用
接受參數(shù)的幾種傳輸方式以及幾種注解:
在上一篇中,我們使用了JDBC鏈接數(shù)據(jù)庫,完成了簡單的后端開發(fā)。但正如我在上文中拋出的問題,我們能不能更好的優(yōu)化我們在Controller中接受參數(shù)的方式呢?這一篇中我們就來聊一聊怎么更有效的接收Json參數(shù)。
傳輸參數(shù)的幾種Method
在定義一個Rest接口時,我們通常會使用GET,POST,PUT,DELETE幾種方式來完成我們所需要進行CRUD的一些操作,我們在這里羅列和教大家在實際開發(fā)中的使用,一些基本概念我們就不再贅述,例如使用POST的優(yōu)缺點,可使用參數(shù)的大小限制等地:
- GET:一般用于查詢數(shù)據(jù),不辦函數(shù)據(jù)的更新以及插入操作。由于明文傳輸?shù)年P系,我們一般用來獲取一些無關用戶的信息。
- POST:一般用于數(shù)據(jù)的插入操作,也是使用最多的傳輸方式,但是在H5調(diào)用時會有跨域的問題,一般使用JSONP來解決。
- PUT:我們使用PUT方式來對數(shù)據(jù)進行更新操作。
- DELETE:用于數(shù)據(jù)刪除,注意在數(shù)據(jù)庫內(nèi)是邏輯刪除(改變數(shù)據(jù)狀態(tài),用戶不再查詢得到,但還保留在數(shù)據(jù)庫內(nèi))還是物理刪除(真刪了)。
以上是很標準的REST風格的接口形式,其實我們可以進源碼看到,他們只不過封裝了
@RequestMapping( method = {RequestMethod.POST} )
這個方法,和我們使用以前的@RequestMapping后寫參數(shù)是一致的。但是在實際開發(fā)中我們一般是前后端分離開發(fā)的,像IOS以及ANDROID開發(fā)他們會固定使用同一套模版進行傳輸,這時可能你所有的接口都會是POST方法。這需要你在開發(fā)中事先和前端人員進行約定,這時接口文檔就會變得非常重要了。方法,入?yún)?,出參,報錯信息都必須清晰的描述在接口文檔中,所以不要小看編寫文檔的能力哦。當然,SpringBoot也為我們提供了強大的API模版,例如swagger。不過使用swagger也不是一勞永逸的,關于swagger,我們之后再聊。
獲取參數(shù)的幾種常用注解
在上一篇中我們使用了幾種注解來獲取參數(shù),例如@RequestParam,@PathVariable,@RequestBody。那我們現(xiàn)在來逐一看一下這些注解我們該如何使用。
- @PathVariable:一般我們使用URI template樣式映射使用,即url/{param}這種形式,也就是一般我們使用的GET,DELETE,PUT方法會使用到的,我們可以獲取URL后所跟的參數(shù)。
- @RequestParam:一般我們使用該注解來獲取多個參數(shù),在()內(nèi)寫入需要獲取參數(shù)的參數(shù)名即可,一般在PUT,POST中比較常用。
- @RequestBody:該注解和@RequestParam殊途同歸,我們使用該注解將所有參數(shù)轉(zhuǎn)換,在代碼部分在一個個取出來,也是目前我使用到最多的注解來獲取參數(shù)(因為前端不愿意一個一個接口的調(diào)試)例如下代碼:
@PostMapping("/createUserByMap") public void createUserByMap(@RequestBody Map<String,Object> reqMap){ String tel = reqMap.get("tel").toString(); String pwd = reqMap.get("pwd").toString(); userService.createUser(tel,pwd); }
當然,我們獲取參數(shù)不僅僅只有上面所提到的那些,還有@RequestHeader來獲取頭信息里的值,@CookieValue來獲取Cookie值等等。在這,我也僅僅說明一些較常用的取值方法而已。
使用對象直接獲取參數(shù)
當我們掌握以上幾種方式來獲取參數(shù)時,看似已經(jīng)毫無問題,其實還是有的,如果我們的入?yún)⑹侄嗄兀恳话賻资畟€參數(shù),你是血一百幾十個@RequestParam,還是@RequestBody之后取一百幾十個次呢?,明顯這些做法都十分麻煩,代碼太多,關鍵是我們懶啊……所以,我們也可以通過POJO來直接獲取參數(shù),之后通過GET方法直接把需要的參數(shù)取出就好。
我們來將上一次的方法給改變下:
/** * 添加用戶2 * @param userInfo */ @PostMapping("/createUser2") public void createUser2(UserInfo userInfo){ userService.createUser(userInfo.getTel(),userInfo.getPassWord()); }
我們來測試一下,發(fā)現(xiàn)失敗了,通過錯誤信息,我們發(fā)現(xiàn)SQL提示password為null,也就是說我們沒有獲取到pwd這個參數(shù),這是因為如果使用對象接受參數(shù),那參數(shù)名必須喝對象的屬性名保持一致。
我們修改參數(shù)名為passWord后可以發(fā)現(xiàn),數(shù)據(jù)可以爭產(chǎn)的進行插入了。
使用@Valid對參數(shù)進行校驗
在使用對象進行參數(shù)接收時,我們可以對參數(shù)進行校驗,假設我們需要用戶輸入的密碼是整數(shù)型且在000000至999999之間的數(shù)值,我們可以對屬性passWord加上如下注解:
@Max(value = 999999,message = "超過最大數(shù)值") @Min(value = 000000,message = "密碼設定不正確") private String passWord;
這里舉的列子并不十分合適,請注意。我們只是針對表單驗證進行講解,在實際開發(fā)處理中要選擇合適的操作。message是反回的提示默認信息。
在controller中我們改寫一下,將返回值設為String,讓我們可以看到報錯信息。
然后我們給對象加入@Valid注解,并在參數(shù)中加入BindingResult來獲取錯誤信息。在邏輯處理中我們判斷BindingResult知否含有錯誤信息,如果有錯誤信息,則直接返回錯誤信息。
/** * 添加用戶2 * @param userInfo */ @PostMapping("/createUser2") public String createUser2(@Valid UserInfo userInfo, BindingResult bindingResult){ if (bindingResult.hasErrors()){ return bindingResult.getFieldError().getDefaultMessage(); } userService.createUser(userInfo.getTel(),userInfo.getPassWord()); return "OK"; }
我們繼續(xù)通過POSTMAN來測試一下,首先我們傳入-10000來設定密碼,發(fā)現(xiàn)提示錯誤密碼設定不正確:
發(fā)現(xiàn)無法完成用戶注冊,我們繼續(xù)通過添加密碼為1000000來設定密碼,發(fā)現(xiàn)提示錯誤信息超過最大數(shù)值:
以上就是我們通過簡單的表單驗證來預防一些惡意數(shù)據(jù)的侵入。不知道你有沒有掌握呢?當然,我們對于數(shù)據(jù)的驗證不僅僅只有表單驗證,我們一般通過數(shù)據(jù)簽名的方式來驗證一個請求是否合法,也可能是將整個參數(shù)進行對稱加密后進行傳輸以保證數(shù)據(jù)不被明文抓包。
那以上所說的處理模式就會用到Spring為我們提供的另一個強大的功能,也是我們使用Spring系列框架中不可或缺的一部分,AOP,切面編程。我們之前所說的統(tǒng)一報錯處理也是使用的AOP功能進行處理的,那關于AOP,我們下周再聊。(原諒我懶得要死,這篇文章也是被迫趕工的……捂臉,逃……)(???)?
以上所有的代碼我已經(jīng)上傳到GitHub
如果心急的小伙伴也可以去clone我已經(jīng)完成的項目,這個項目中把一些常用功能都寫了,并且都寫注釋啦?。?!
總結(jié)
到此這篇關于SpringBoot開發(fā)詳解之Controller接收參數(shù)及參數(shù)校驗的文章就介紹到這了,更多相關SpringBoot Controller接收參數(shù)及校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
jsch中ChannelShell與ChannelExec的區(qū)別及說明
這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07詳解java操作Redis數(shù)據(jù)庫的redis工具(RedisUtil,jedis工具JedisUtil,JedisPoo
這篇文章主要介紹了java操作Redis數(shù)據(jù)庫的redis工具,包括RedisUtil,jedis工具JedisUtil,JedisPoolUtil工具,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-08-08Java Flink窗口觸發(fā)器Trigger的用法詳解
Trigger(窗口觸發(fā)器)決定了窗口(由 WindowAssigner 產(chǎn)生)什么時候調(diào)用窗口處理函數(shù)。可以根據(jù)指定的時間或數(shù)據(jù)元素條件來決定什么時候觸發(fā)。本文將詳細講講其用法,需要的可以參考一下2022-07-07Java關于遠程調(diào)試程序教程(以Eclipse為例)
這篇文章主要介紹了Java關于遠程調(diào)試程序教程(以Eclipse為例),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06使用@Autowired可以注入ApplicationContext
這篇文章主要介紹了使用@Autowired可以注入ApplicationContext問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06