这篇文章主要给大家介绍了关于SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
spring boot 常见http get ,post请求参数处理
在定义Rest接口时,我们通常使用GET、POST、PUT和DELETE来添加、删除和检查数据。其中一些方法需要传递参数,后台开发人员必须对收到的参数进行验证,以保证程序的健壮性。
GET
一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据POST
一般用于插入数据PUT
一般用于数据更新DELETE
一般用于数据删除
一般都是进行逻辑删除(即:仅仅改变记录的状态,而并非真正的删除数据)
@ pathwaribale获取url中的数据
@RequestParam获取请求参数的值
@GetMapping组合注释是@ request mapping(method = request method . get)的缩写。
@RequestBody使用一个对象从前端获取数据。
PathVaribale 获取url路径的数据
请求URL:
Localhost:8080/hello/id获取id值
实现代码如下:
@RestControllerpublic 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; }}
在浏览器中输入地址:
本地主机:8080/hello/100/hello
输出:
id:81姓名:你好
RequestParam 获取请求参数的值
获取url参数值。默认情况下,方法参数名称应该与url参数一致。
本地主机:8080/helloid=1000
@RestControllerpublic class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id){ return "id:"+id; }}
输出:
编号:100
当url中有多个参数时,例如:
localhost:8080/hello id = 98 amp;ampname=helloworld
具体代码如下:
@RestControllerpublic class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam Integer id,@RequestParam String name){ return "id:"+id+ " name:"+name; }}
获取url参数值并执行参数名。
本地主机:8080/hellouserId=1000
@RestControllerpublic class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam("userId") Integer id){ return "id:"+id; }}
输出:
编号:100
注意
如果不输入id的具体值,返回的结果将为null。具体测试结果如下:
id:空
如果未输入id参数,将会报告以下错误:
白色错误页面错误
GET参数校验
用法:不输入id时,使用默认值。
具体代码如下:
本地主机:8080/你好
@RestControllerpublic 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参数校验
普通支票票据
注意:
默认情况下,所有接收到的参数都是字符串类型。
一些注释只能用于字符串类型的属性。
@JsonProperty可以解决前端属性名和后端实体类属性名不一致的问题。
验证方法:
使用@RequestBody @Valid获取并验证JSON参数。
通过BindingResult获取验证结果。
BindingResult源代码:
提示01:使用BindingResult对象的hasErrors方法来确定是否有参数错误。
提示02:使用BindingResult对象的getFieldErrors方法获取所有有参数错误的属性。
提示03:使用error属性对象的getDefaultMessage获取错误消息。
@RequestMapping(value = "/demo5",produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody public String test5(@RequestBody @Valid User user , BindingResult bindingResult){ if(bindingResult.hasErrors()){ Listlt;ObjectErrorgt; 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; }
对应用户实体类别的代码:
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"; Classlt;gt;[] groups() default {}; Classlt; extends Payloadgt;[] payload() default {};}
2.定义约束检查。
import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.lang.annotation.Annotation;public class MyFormValidatorClass implements ConstraintValidatorlt;MyFormValidator, Objectgt;, 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 Classlt; extends Annotationgt; 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()){ Listlt;ObjectErrorgt; 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中会出现此错误。
总结
关于SpringBoot中常见的get/post请求参数处理、参数标注验证、参数自定义标注验证的详细讲解,本文到此为止。关于springboot中常见http get post请求参数处理的更多信息
精彩评论