SpringBoot開發詳解(五)--Controller接收參數以及參數校驗


SpringBoot開發詳解(五)--Controller接收參數以及參數校驗

Controller 中注解使用

接受參數的幾種傳輸方式以及幾種注解:
在上一篇中,我們使用了JDBC鏈接數據庫,完成了簡單的后端開發。但正如我在上文中拋出的問題,我們能不能更好的優化我們在Controller中接受參數的方式呢?這一篇中我們就來聊一聊怎么更有效的接收Json參數。

傳輸參數的幾種Method

在定義一個Rest接口時,我們通常會使用GET,POST,PUT,DELETE幾種方式來完成我們所需要進行CRUD的一些操作,我們在這里羅列和教大家在實際開發中的使用,一些基本概念我們就不再贅述,例如使用POST的優缺點,可使用參數的大小限制等地:

  • GET:一般用於查詢數據,不辦函數據的更新以及插入操作。由於明文傳輸的關系,我們一般用來獲取一些無關用戶的信息。

  • POST:一般用於數據的插入操作,也是使用最多的傳輸方式,但是在H5調用時會有跨域的問題,一般使用JSONP來解決。

  • PUT:我們使用PUT方式來對數據進行更新操作。

  • DELETE:用於數據刪除,注意在數據庫內是邏輯刪除(改變數據狀態,用戶不再查詢得到,但還保留在數據庫內)還是物理刪除(真刪了)。

以上是很標准的REST風格的接口形式,其實我們可以進源碼看到,他們只不過封裝了
@RequestMapping(
method = {RequestMethod.POST}
)
這個方法,和我們使用以前的@RequestMapping后寫參數是一致的。但是在實際開發中我們一般是前后端分離開發的,像IOS以及ANDROID開發他們會固定使用同一套模版進行傳輸,這時可能你所有的接口都會是POST方法。這需要你在開發中事先和前端人員進行約定,這時接口文檔就會變得非常重要了。方法,入參,出參,報錯信息都必須清晰的描述在接口文檔中,所以不要小看編寫文檔的能力哦。當然,SpringBoot也為我們提供了強大的API模版,例如swagger。不過使用swagger也不是一勞永逸的,關於swagger,我們之后再聊。

獲取參數的幾種常用注解

在上一篇中我們使用了幾種注解來獲取參數,例如@RequestParam,@PathVariable,@RequestBody。那我們現在來逐一看一下這些注解我們該如何使用。

  • @PathVariable:一般我們使用URI template樣式映射使用,即url/{param}這種形式,也就是一般我們使用的GET,DELETE,PUT方法會使用到的,我們可以獲取URL后所跟的參數。

  • @RequestParam:一般我們使用該注解來獲取多個參數,在()內寫入需要獲取參數的參數名即可,一般在PUT,POST中比較常用。

  • @RequestBody:該注解和@RequestParam殊途同歸,我們使用該注解將所有參數轉換,在代碼部分在一個個取出來,也是目前我使用到最多的注解來獲取參數(因為前端不願意一個一個接口的調試)例如下代碼:

@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);
}
  •  

當然,我們獲取參數不僅僅只有上面所提到的那些,還有@RequestHeader來獲取頭信息里的值,@CookieValue來獲取Cookie值等等。在這,我也僅僅說明一些較常用的取值方法而已。

使用對象直接獲取參數

當我們掌握以上幾種方式來獲取參數時,看似已經毫無問題,其實還是有的,如果我們的入參十分多呢?一百幾十個參數,你是血一百幾十個@RequestParam,還是@RequestBody之后取一百幾十個次呢?,明顯這些做法都十分麻煩,代碼太多,關鍵是我們懶啊……所以,我們也可以通過POJO來直接獲取參數,之后通過GET方法直接把需要的參數取出就好。
我們來將上一次的方法給改變下:

/** * 添加用戶2 * @param userInfo */
@PostMapping("/createUser2")
public void createUser2(UserInfo userInfo){
    userService.createUser(userInfo.getTel(),userInfo.getPassWord());
}
  •   

我們來測試一下,發現失敗了,通過錯誤信息,我們發現SQL提示password為null,也就是說我們沒有獲取到pwd這個參數,這是因為如果使用對象接受參數,那參數名必須喝對象的屬性名保持一致。
這里寫圖片描述

我們修改參數名為passWord后可以發現,數據可以爭產的進行插入了。

這里寫圖片描述

這里寫圖片描述

使用@Valid對參數進行校驗

在使用對象進行參數接收時,我們可以對參數進行校驗,假設我們需要用戶輸入的密碼是整數型且在000000至999999之間的數值,我們可以對屬性passWord加上如下注解:

@Max(value = 999999,message = "超過最大數值")
@Min(value = 000000,message = "密碼設定不正確")
private String passWord;
  •  

這里舉的列子並不十分合適,請注意。我們只是針對表單驗證進行講解,在實際開發處理中要選擇合適的操作。message是反回的提示默認信息。
在controller中我們改寫一下,將返回值設為String,讓我們可以看到報錯信息。
然后我們給對象加入@Valid注解,並在參數中加入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";
}
  •  

我們繼續通過POSTMAN來測試一下,首先我們傳入-10000來設定密碼,發現提示錯誤密碼設定不正確:

這里寫圖片描述

發現無法完成用戶注冊,我們繼續通過添加密碼為1000000來設定密碼,發現提示錯誤信息超過最大數值:

這里寫圖片描述

以上就是我們通過簡單的表單驗證來預防一些惡意數據的侵入。不知道你有沒有掌握呢?當然,我們對於數據的驗證不僅僅只有表單驗證,我們一般通過數據簽名的方式來驗證一個請求是否合法,也可能是將整個參數進行對稱加密后進行傳輸以保證數據不被明文抓包。
那以上所說的處理模式就會用到Spring為我們提供的另一個強大的功能,也是我們使用Spring系列框架中不可或缺的一部分,AOP,切面編程。我們之前所說的統一報錯處理也是使用的AOP功能進行處理的,那關於AOP,我們下周再聊。(原諒我懶得要死,這篇文章也是被迫趕工的……捂臉,逃……)(◐‿◑)

以上所有的代碼我已經上傳到GitHub

round1-springboot

如果心急的小伙伴也可以去clone我已經完成的項目,這個項目中把一些常用功能都寫了,並且都寫注釋啦!!!

MySpringBoot

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM