http get post 参数校验
spring boot 常见http get ,post请求参数处理
在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性
GET
一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据
POST
一般用于插入数据
PUT
一般用于数据更新
DELETE
一般用于数据删除
一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据)
@PathVaribale 获取url中的数据
@RequestParam 获取请求参数的值
@GetMapping 组合注解,是 @RequestMapping(method = RequestMethod.GET) 的缩写
@RequestBody 利用一个对象去获取前端传过来的数据
PathVaribale 获取url路径的数据
请求URL:
localhost:8080/hello/id 获取id值
实现代码如下:
@RestController
public class HelloController {
@RequestMapping(value="/hello/{id}/{name}",method= RequestMethod.GET)
public String sayHello(@PathVariable("id") Integer id,@PathVariable("name") String name){
return "id:"+id+" name:"+name;
}
}
在浏览器中 输入地址:
localhost:8080/hello/100/hello
输出:
id:81name:hello
RequestParam 获取请求参数的值
获取url参数值,默认方式,需要方法参数名称和url参数保持一致
localhost:8080/hello?id=1000
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(@RequestParam Integer id){
return "id:"+id;
}
}
输出:
id:100
url中有多个参数时,如:
localhost:8080/hello?id=98&&name=helloworld
具体代码如下:
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(@RequestParam Integer id,@RequestParam String name){
return "id:"+id+ " name:"+name;
}
}
获取url参数值,执行参数名称方式
localhost:8080/hello?userId=1000
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
public String sayHello(@RequestParam("userId") Integer id){
return "id:"+id;
}
}
输出:
id:100
注意
不输入id的具体值,此时返回的结果为null。具体测试结果如下:
id:null
不输入id参数,则会报如下错误:
whitelable Error Page错误
GET参数校验
用法:不输入id时,使用默认值
具体代码如下:
localhost:8080/hello
@RestController
public class HelloController {
@RequestMapping(value="/hello",method= RequestMethod.GET)
//required=false 表示url中可以无id参数,此时就使用默认参数
public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){
return "id:"+id;
}
}
输出
id:1
POST JSON参数校验
常用校验注解
注意:
接收到的参数默认都是字符串类型的
有的注解只能用在String类型的属性上
@JsonProperty可以实现前端的属性名和后台实体类的属性名不一致问题
校验方式:
使用@RequestBody @Valid 对JSON参数进行获取和校验。
通过BindingResult bindingResult 去获取校验结果。
BindingResult 源码:
技巧01:利用BindingResult对象的hasErrors方法判断是否有参数错误
技巧02:利用BindingResult对象的getFieldErrors方法获取所有有参数错误的属性
技巧03:利用错误属性对象的getDefaultMessage去获取错误提示信息
@RequestMapping(value = "/demo5",produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String test5(@RequestBody @Valid User user , BindingResult bindingResult){
if(bindingResult.hasErrors()){
List<ObjectError> objectErrors = bindingResult.getAllErrors();
System.out.println(objectErrors.toString());
for(ObjectError objectError: objectErrors){
System.out.println("objectError = " + objectError.getObjectName());
System.out.println("objectError = " + objectError.getDefaultMessage());
System.out.println("objectError = " + objectError.getCode());
System.out.println("objectError = " + objectError.getArguments());
}
}
String str = user.toString();
return str;
}
对应User实体类代码:
public class User {
@NotEmpty(message = "ID不能为空")
@NotBlank(message = "ID不能为空哟")
private String id;
@Min(value = 18)
@Max(value = 30)
private Integer age;
@NotEmpty(message = "昵称不能为空")
@NotBlank(message = "昵称不能为空哟")
@JsonProperty("nickname") // 当前端属性为nick后台接收对象的属性为nickName时可以用@JsonProperty来保持一致
private String name;
....省略get set方法
自定义注解校验
1、定义一个校验注解
代码如下:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Constraint(validatedBy = MyFormValidatorClass.class)
public @interface MyFormValidator {
String value();
String message() default "name can be test";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2、定义一个约束校验
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
public class MyFormValidatorClass implements ConstraintValidator<MyFormValidator, Object>, Annotation {
private String values;
@Override
public void initialize(MyFormValidator myFormValidator) {
this.values = myFormValidator.value();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if("test".equals((String)value)){
return true;
}
return false;
}
@Override
public Class<? extends Annotation> annotationType() {
return null;
}
}
3、实体类中使用
public class User2 {
@NotEmpty(message = "ID不能为空")
@NotBlank(message = "ID不能为空哟")
//自定义校验注解-校验id是否为test
@MyFormValidator(value = "abc",message = "dd")
private String id;
@Min(value = 18)
@Max(value = 30)
private Integer age;
@NotEmpty(message = "昵称不能为空")
@NotBlank(message = "昵称不能为空哟")
@JsonProperty("nickname") // 当前端属性为nick后台接收对象的属性为nickName时可以用@JsonProperty来保持一致
4、测试代码:
@RequestMapping(value = "/demo6",produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody
public String test6(@RequestBody @Valid User2 user , BindingResult bindingResult){
if(bindingResult.hasErrors()){
List<ObjectError> objectErrors = bindingResult.getAllErrors();
System.out.println(objectErrors.toString());
for(ObjectError objectError: objectErrors){
System.out.println("objectError = " + objectError.getObjectName());
System.out.println("objectError = " + objectError.getDefaultMessage());
System.out.println("objectError = " + objectError.getCode());
System.out.println("objectError = " + objectError.getArguments());
}
}
String str = user.toString();
return str;
}
当请求参数ID不为test,objectErrors 中有该报错。
--------------------- 本文来自 混沌风YF 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yunfeng482/article/details/79756233?utm_source=copy
http get post 参数校验的更多相关文章
- java自定义注解实现前后台参数校验
2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...
- jQuery form插件的使用--用 formData 参数校验表单,验证后提交(简单验证).
Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.引入依赖js <script src=& ...
- SpringMVC参数校验(针对`@RequestBody`返回`400`)
SpringMVC参数校验(针对@RequestBody返回400) 前言 习惯别人帮忙做事的结果是自己不会做事了.一直以来,spring帮我解决了程序运行中的各种问题,我只要关心我的业务逻辑,设计好 ...
- python项目使用jsonschema进行参数校验
python项目使用jsonschema进行参数校验 最近想要给一个新的openstack项目加上参数校验,过完年回来准备开工的时候,发现其他人已经在做了,对应的patch是:https://revi ...
- Spring Boot 参数校验
1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spr ...
- 【spring】-- jsr303参数校验器
一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...
- 补习系列(4)-springboot 参数校验详解
目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...
- Spring基础系列-参数校验
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9953744.html Spring中使用参数校验 概述 JSR 303中提出了Bea ...
- Java笔记 #06# 自定义简易参数校验框架——EasyValidator
索引 一.校验效果演示 二.校验器定义示例 定义一个最简单的校验器 正则校验器 三.EasyValidator的实现 四.更好的应用姿势——配合注解和面向切面 “参数校验”属于比较无聊但是又非常硬性的 ...
- spring注解式参数校验
很痛苦遇到大量的参数进行校验,在业务中还要抛出异常或者返回异常时的校验信息,在代码中相当冗长,今天我们就来学习spring注解式参数校验. 其实就是:hibernate的validator. 开始啦. ...
随机推荐
- python爬虫之有道在线翻译
今天初学了python这门课 老师简单的讲解了一下 python的安装环境,配置环境变量,当前主流Python使用的是3.x版本, 下午简单的讲解了python的起源,发展以及在各个方面的应用 然后晚 ...
- Python学习 :深浅拷贝
深浅拷贝 一.浅拷贝 只拷贝第一层数据(不可变的数据类型),并创建新的内存空间进行储蓄,例如:字符串.整型.布尔 除了字符串以及整型,复杂的数据类型都使用一个共享的内存空间,例如:列表 列表使用的是同 ...
- DHT11温湿度传感器编程思路以及代码的实现(转载)
源自:https://blog.csdn.net/qq_34952376/article/details/81193938 在我们刚开始进入单片机的学习中,练习写传感器的时序是必不可少的,其实我比较推 ...
- Infinite Maze CodeForces - 196B
We've got a rectangular n × m-cell maze. Each cell is either passable, or is a wall (impassable). A ...
- FireDAC 连接Access (accdb)数据库
FireDAC可以方便连接数据库,但是要连接新版本的accdb数据库,要注意这样的事项(以Office2010版为例) 安装Office2010 x86版,注意,不能安装x64版,因为Delphi I ...
- 基于HTML5移动web应用
一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架 二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...
- coreos install hpssacli
基于官方的coreos ramdisk安装hp raid管理工具,其版本为debian8 apt-get install curl nano /etc/apt/sources.list deb htt ...
- Halcon17对硬件配置要求
Halcon17对硬件配置要求 Halcon17已经发布出来了,很多朋友一定想安装这款机器视觉软件来学习,我们今天给大家讲解下,Halcon17对硬件配置的要求: Halcon17 For Wind ...
- shell语句for循环
一:常用格式 格式一 for 变量 do 语句 done 格式二 for 变量 in 列表 do 语句 done 格式三 for ((变量=初始值; 条件判断; 变量变化)) do 语句 done 二 ...
- Spark实战练习03--Pair RDD
一.场景 现有某网站的网站日志,内容为用户对网站的请求,包含user ID.IP address.datetime……等等 另有一份文件中包含用户的账户详细信息数据,包含User ID.creatio ...