今天难得双更,大家点个关注捧个场
原文地址:后端系统开发之——接口参数校验 - Pleasure的博客
下面是正文内容:
前言
在上一篇文章中提到了接口的开发,虽然是完成了,但还是缺少一些细节——传入参数的校验。
即用户传入的参数要符合系统的使用需求。比如用户名和密码的长度要适宜,虽然可以在前端页面直接进行筛选,但是在后端再加一层可以使系统更加稳固。
这篇文章就主要来谈谈这个。具体的文件内容详见上一篇博文。
正文
前置知识
主要是关于正则表达式的,知道的可以直接跳过。
- . (点号): 匹配除换行符以外的任意单个字符。
- \d: 匹配一个数字字符。
- \w: 匹配一个单词字符,包括字母、数字和下划线。
- \s: 匹配一个空白字符,包括空格、制表符、换行符等。
- ^: 匹配字符串的开始位置。
- $: 匹配字符串的结束位置。
- \b: 匹配一个单词边界。
- []: 字符集,匹配其中任意一个字符。
- |: 或,用于在两个模式之间选择一个。
- ?: 匹配零次或一次前面的元素。
- +: 匹配一次或多次前面的元素。
- ***: 匹配零次或多次前面的元素。
- {n}: 匹配前面元素恰好 n 次。
- {n,}: 匹配前面元素至少 n 次。
- {n,m}: 匹配前面元素至少 n 次,至多 m 次。
正式操作
接口返回的响应信息格式要以接口文档为准。
这里的信息响应格式统一为{code message data},在Result.java中已经进行了规范。
虽然传入参数的校验可以通过手动的方式进行检验,即通过if和else的判断来进行检验,但当参数的规模增多代码的编写量也就成倍的增多,能偷懒就偷懒。
所以这里就需要用到一个新的依赖——Spring Validation。
同样的,先在pom.xml文件中添加下面的内容。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
我们只需要在参数前添加下面这样的字段,就可以起到校验的作用
package org.example.controller;
import jakarta.validation.constraints.Pattern;
import org.example.pojo.Result;
import org.example.pojo.User;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@Autowired
private UserService userService;
@PostMapping("register")
public Result register(@Pattern(regexp = "^\\S{5,16}$") String username, @Pattern(regexp = "^\\S{5,16}$") String password) {
//查询用户
User u = userService.findByUserName(username);
if (u == null) {
//没有占用
//注册
userService.register(username, password);
return Result.success();
} else {
//占用
return Result.error("用户名已被占用");
}
//注册
}
}
然而返回的参数格式是{timestamp status error path},不符合要求
最后再来规范一下响应信息的格式以符合接口文档的要求。
在org.example文件加下新建Exception文件夹,其下新建Java类GlobalExceptionHandler.java。
package org.example.exception;
import org.example.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
e.printStackTrace();
return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage() : "操作失败");
}
}
测试传入参数,操作完成。
尾声
后面是关于登录接口的开发。