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 = ("tel").toString();
String pwd = ("pwd").toString();
}
springboot aop
当然,我们获取参数不仅仅只有上⾯所提到的那些,还有@RequestHeader来获取头信息⾥的值,@CookieValue来获取Cookie值等等。在这,我也仅仅说明⼀些较常⽤的取值⽅法⽽已。
使⽤对象直接获取参数
当我们掌握以上⼏种⽅式来获取参数时,看似已经毫⽆问题,其实还是有的,如果我们的⼊参⼗分多呢?⼀百⼏⼗个参数,你是⾎⼀百⼏⼗个@RequestParam,还是@RequestBody之后取⼀百⼏⼗个次呢?,明显这些做法都⼗分⿇烦,代码太多,关键是我们懒啊……所以,我们也可以通过POJO来直接获取参数,之后通过GET⽅法直接把需要的参数取出就好。
我们来将上⼀次的⽅法给改变下:
我们来测试⼀下,发现失败了,通过错误信息,我们发现SQL提⽰password为null,也就是说我们没有获取到pwd这个参数,这是因为如
果使⽤对象接受参数,那参数名必须喝对象的属性名保持⼀致。 我们修改参数名为passWord后可以发现,数据可以争产的进⾏插⼊了。
/**
* 添加⽤户2
* @param  userInfo
*/
@PostMapping ("/createUser2")
public  void  createUser2(UserInfo userInfo){
}
使⽤@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()){
FieldError().getDefaultMessage();
}
return"OK";
}
我们继续通过POSTMAN来测试⼀下,⾸先我们传⼊-10000来设定密码,发现提⽰错误密码设定不正确:
发现⽆法完成⽤户注册,我们继续通过添加密码为1000000来设定密码,发现提⽰错误信息超过最⼤数值:
以上就是我们通过简单的表单验证来预防⼀些恶意数据的侵⼊。不知道你有没有掌握呢?当然,我们对于数据的验证不仅仅只有表单验证,我们⼀般通过数据签名的⽅式来验证⼀个请求是否合法,也可能是将整个参数进⾏对称加密后进⾏传输以保证数据不被明⽂抓包。
那以上所说的处理模式就会⽤到Spring为我们提供的另⼀个强⼤的功能,也是我们使⽤Spring系列框架中不可或缺的⼀部分,AOP,切⾯编程。我们之前所说的统⼀报错处理也是使⽤的AOP功能进⾏处理的,那关于AOP,我们下周再聊。(原谅我懒得要死,这篇⽂章也是被迫赶⼯的……捂脸,逃……)(◐‿◑)
以上所有的代码我已经上传到GitHub
如果⼼急的⼩伙伴也可以去clone我已经完成的项⽬,这个项⽬中把⼀些常⽤功能都写了,并且都写注释啦

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。