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

使用对象直接获取参数

当我们掌握以上几种方式来获取参数时,看似已经毫无问题,其实还是有的,如果我们的入参十分多呢?一百几十个参数,你是血一百几十个@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,让我们可以看到报错信息。

/** * 添加用户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";
}

然后我们给对象加入@Valid注解,并在参数中加入BindingResult来获取错误信息。在逻辑处理中我们判断BindingResult知否含有错误信息,如果有错误信息,则直接返回错误信息。

我们继续通过POSTMAN来测试一下,首先我们传入-10000来设定密码,发现提示错误密码设定不正确:

发现无法完成用户注册,我们继续通过添加密码为1000000来设定密码,发现提示错误信息超过最大数值:

以上就是我们通过简单的表单验证来预防一些恶意数据的侵入。不知道你有没有掌握呢?当然,我们对于数据的验证不仅仅只有表单验证,我们一般通过数据签名的方式来验证一个请求是否合法,也可能是将整个参数进行对称加密后进行传输以保证数据不被明文抓包。 那以上所说的处理模式就会用到Spring为我们提供的另一个强大的功能,也是我们使用Spring系列框架中不可或缺的一部分,AOP,切面编程。我们之前所说的统一报错处理也是使用的AOP功能进行处理的,那关于AOP,我们以后再聊。

原文地址:

https://blog.csdn.net/qq_31001665/article/details/71075743

原文发布于微信公众号 - java技术学习之道(javajsxxzd)

原文发表时间:2018-04-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Play & Scala 技术分享

Netty基础 - 为什么ChannelOutboundHandler会声明一个read方法?

3409
来自专栏Netkiller

Spring boot with Thymeleaf

本文节选自电子书《Netkiller Java 手札》 5.19. Spring boot with Thymeleaf 5.19.1. Maven <dep...

32313
来自专栏Java成长之路

jsonp详解

说到AJAX就会不可避免的面临两个问题,第一个是AJAX以何种格式来交换数据?第二个是跨域的需求如何解决?这两个问题目前都有不同的解决方案,比如数据可以用自定义...

1064
来自专栏JetpropelledSnake

Web前端学习笔记之前端跨域知识总结

相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的。但跨域方法的多种多样实在让人目不暇接。老规矩,碰到这种情况,就只能自己总结一篇博客,...

613
来自专栏圣杰的专栏

ABP入门系列(7)——分页实现

完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能。 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊。 来来来,这一节咱们就来捋一捋如何使用...

2215
来自专栏Java学习之路

Struts2学习---基本配置,action,动态方法调用,action接收参数 动态方法调用action接收参数

首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org...

2777
来自专栏张善友的专栏

ASP.NET 路由

ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL。由于 URL 不必映射到文件,所以可以在 Web 应用程序中使用 URL,这些 URL 是描...

1857
来自专栏Java3y

Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的...

4425
来自专栏向治洪

Spring boot之hello word

环境准备 一个称手的IDE(首选Myeclipse,也可以选Eclipse) Java环境(JDK 1.7或以上版本) Maven 3.0+(Eclipse和I...

1817
来自专栏Pythonista

Django之XSS攻击

    xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。 ...

852

扫码关注云+社区