SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解

目录
  • springboot常见httpget,post请求参数处理
  • PathVaribale获取url路径的数据
  • RequestParam获取请求参数的值
    • 注意
    • GET参数校验
    • POSTJSON参数校验
    • 自定义注解校验
  • 总结

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 中有该报错。

总结

到此这篇关于SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解的文章就介绍到这了,更多相关springboot常见http get post请求参数处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot处理请求参数中包含特殊符号

    今天写代码遇到了一个问题,请求参数是个路径"D:/ExcelFile",用postman测试时遇到的下图中的报错 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986   at org.apache.coyote.http11.Http11InputBuffer

  • springboot中不能获取post请求参数的解决方法

    问题描述 最近在做微信小程序,用的spring boot做后端,突然发现客户端发送post请求的时候服务端接收不到参数.问题简化之后如下: 微信小程序端: 在页面放一个按钮进行测试 <!--index.wxml--> <view class="container"> <button catchtap='testpost'>点击进行测试</button> </view> 绑定一个函数发送post请求 //index.js //获

  • 解决Springboot get请求是参数过长的情况

    问题原因 Springboot get请求是参数过长抛出异常:Request header is too large 的问题 错误描述 java.lang.IllegalArgumentException: Request header is too large 解决方案 请求头超过了tomcat的限值.本来post请求是没有参数大小限制,但是服务器有自己的默认大小. 设置服务器大小: 1.普通tomcat 在server.xml中 <Connector connectionTimeout=&quo

  • SpringBoot拦截器如何获取http请求参数

    1.1.获取http请求参数是一种刚需 我想有的小伙伴肯定有过获取http请求的需要,比如想 前置获取参数,统计请求数据 做服务的接口签名校验 敏感接口监控日志 敏感接口防重复提交 等等各式各样的场景,这时你就需要获取 HTTP 请求的参数或者请求body,一般思路有两种,一种就是自定义个AOP去拦截目标方法,第二种就是使用拦截器.整体比较来说,使用拦截器更灵活些,因为每个接口的请求参数定义不同,使用AOP很难细粒度的获取到变量参数,本文主线是采用拦截器来获取HTTP请求. 1.2.定义拦截器获

  • SpringBoot常见get/post请求参数处理、参数注解校验及参数自定义注解校验详解

    目录 springboot常见httpget,post请求参数处理 PathVaribale获取url路径的数据 RequestParam获取请求参数的值 注意 GET参数校验 POSTJSON参数校验 自定义注解校验 总结 spring boot 常见http get ,post请求参数处理 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 GET一般用于查询数

  • SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)

    第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互.不熟悉真的折腾了好久,现在总结一下学习过程: 第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本.在网上海搜了一把,能找到的有点相关的寥寥无几. 有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现基于命令行调试的交互界面,输入调试命令去调试脚本.如下: 在终端输入命令:redis-cli.exe --ldb --eval LimitLoadTi

  • SpringBoot应用自定义logback日志详解

    目录 概述 logback配置详解 配置内容概念介绍 配置介绍 SpringBoot中自定义logback 多环境输出日志文件 读取配置文件配置 概述 默认情况下,SpringBoot内部使用logback作为系统日志实现的框架,将日志输出到控制台,不会写到日志文件.如果在application.properties或application.yml配置,这样只能配置简单的场景,保存路径.日志格式等.复杂的场景(区分 info 和 error 的日志.每天产生一个日志文件等)满足不了,只能自定义配

  • PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)

    本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

  • Nest.js参数校验和自定义返回数据格式详解

    0x0 参数校验 参数校验大部分业务是使用 Nest.js 中的管道 方法实现,具体可以查阅文档 .不过编写过程中遇到一些问题,虽然文档讲得比较晦涩. 在做个查询接口,里面包含一些参数,做成 dto 结构数据: import { ApiProperty } from '@nestjs/swagger' export class QueryUserDto { @ApiProperty({ required: false, description: '页码' }) readonly currentP

  • PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)

    register_globals的值可以设置为:On或者Off,我们举一段代码来分别描述它们的不同. 代码: 复制代码 代码如下: <form name="frmTest" id="frmTest" action="URL"> <input type="text" name="user_name" id="user_name"> <input type=&q

  • Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    目录 Springboot整合zookeeper教程 1.环境准备 2.代码编写 2.1.在pom.xml文件中增加zookeeper依赖(记得跟自己的zookeeper版本对应) 2.2.API测试 3.全部代码 Springboot整合zookeeper教程 1.环境准备 zookeeper集群环境 一个简单的springboot项目环境 不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~ zookeeper集群搭建步骤(超详细

  • 使用自定义注解进行restful请求参数的校验方式

    目录 自定义注解进行restful请求参数的校验 1.首先我们使用@interface定义一个注解 2.实现注解实现类(和@interface定义的注解在同一个包下) 3.在需要校验的对象的字段上加上@ByteLength注解 springboot小技巧:restful接口参数校验,自定义校验规则 restful风格接口参数校验 自定义参数校验注解方法 自定义注解进行restful请求参数的校验 在使用springmvc开发的时候,我们通常会在controller中的方法参数实体类中加上@Not

  • SpringBoot参数校验Validator框架详解

    目录 SpringBoot 如何进行参数校验 1.集成Validator校验框架 1.1. 引入依赖包 1.2. 定义要参数校验的实体类 1.3. 定义校验类进行测试 1.4. 测试结果1 1.5. 问题 1.6. 将参数异常加入全局异常 1.7. 测试结果2 2. 自定义注解 2.1. 第一步,创建自定义注解 2.2. 第二步,自定义校验逻辑 2.3. 第三步,在字段上增加注解 2.4. 第四步,体验效果 3. 分组校验 3.1. 第一步,定义分组接口 3.2. 第二步,在模型中给参数分配分组

  • SpringBoot如何使用自定义注解实现接口限流

    目录 使用自定义注解实现接口限流 1.自定义限流注解 2.限流类型枚举类 3.限流 Lua 脚本 4.限流切面处理类 5.使用与测试 SpringBoot工程中限流方式 1.google的guava,令牌桶算法实现限流 2.interceptor+redis根据注解限流 使用自定义注解实现接口限流 在高并发系统中,保护系统的三种方式分别为:缓存,降级和限流. 限流的目的是通过对并发访问请求进行限速或者一个时间窗口内的的请求数量进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待. 1.

随机推荐