网易首页 > 网易号 > 正文 申请入驻

如何在 Spring Boot 中验证 JSON 请求正文

0
分享至

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。

我们将研究 request-validator 库,它能够将用户输入与预定义的一组规则(如 required、max、min、email 等)进行比较。

我们有时会遇到由于用户提供的输入长于数据库列大小甚至不存在的 ENUM 值而导致的服务器错误。不信任用户输入是一种流行的陈词滥调,如果实施,将节省大量时间和资源。
这就是为什么在本文中,我们将研究request-validator库,它能够将用户输入与一组预定义的规则进行比较,并在有错误时返回错误。
依赖安装
为了让我们使用request-validator,我们需要将它添加到我们项目的pom.xml中:
清单 2.1 pom.xml


com.smattme
request-validator
0.0.2


最新版本的依赖项在Maven 中心可用。
验证 JSON 请求正文
鉴于我们有一个简单的登录端点,需要有效的电子邮件和密码,并且作为一名优秀的工程师,我们希望确保用户发送两个字段并且电子邮件是有效的。
我们可以使用request-validator 库轻松实现这一点。对于电子邮件 输入字段,我们希望用户提供一个非空字段和一个有效的电子邮件地址,而对于密码字段,我们只希望用户提供一个非空值:
清单 3.1 LoginController.java
@RestController
public class LoginController {
@PostMapping("/auth/login")
public ResponseEntity login(@RequestBody LoginRequest request) {
Map rules = new HashMap<>();
rules.put("email", "required|email");
rules.put("password", "required");
List errors = RequestValidator.validate(request, rules);
if (!errors.isEmpty()) {
GenericResponse genericResponse = new GenericResponse();
genericResponse.setStatus(false);
genericResponse.setCode(HttpStatus.BAD_REQUEST.value());
genericResponse.setErrors(errors);
genericResponse.setMessage("Missing required parameter(s)");
return ResponseEntity.badRequest().body(genericResponse);
}
//otherwise all is well, process the request
//loginService.login()
return ResponseEntity.ok(GenericResponse.generic200ResponseObj("Login successful"));
}
}
从上面的清单 3.1 中,我们使用Map来存储每个预期请求字段的规则。映射的键是 API 用户应提供的字段名称,而值包含验证规则。
然后我们调用RequestValidator.validate()方法来检查传入的请求对象是否符合定义的规则。该方法返回一个List,如果存在违规,它将包含所有错误消息。
该库的一大优势是它为每个规则返回一个单独的描述性错误消息,并在一次调用中检查所有规则。
因为RequestValidator.validate()需要Object数据类型,所以请求对象可以是Map、POJO 甚至是 JSON String。
如果 API 用户提供了无效的请求正文,他们将收到 400 错误请求,其中包含所有数据违规的详细列表:
清单 3.2 curl请求/响应

Request:
curl --location --request POST 'http://localhost:8080/auth/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "john"
}'
Response:
{
"status": false,
"message": "Missing required parameter(s)",
"errors": [
"password is required",
"email supplied is invalid"
],
"code": 400
}


但是,正如预期的那样,有效的请求正文将返回成功:
清单 3.3 curl请求/响应

Request:
curl --location --request POST 'http://localhost:8080/auth/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "john@example.com",
"password": "changeit"
}'
Response:
{
"status": true,
"message": "Login successful",
"code": 200
}


请注意,返回的List错误可以以您和您的团队选择的任何方式用作您的响应的一部分。它不限于本文中演示的响应格式。
本文末尾提供了完整的源代码,它将帮助您更好地理解本教程中的响应格式是如何格式化的。
请求验证器库允许我们使用竖线 (|) 字符作为分隔符将一个或多个规则组合在一起。从上面的清单 3.1 中,我们使用|将required和email规则组合在一起。.
唯一的例外是在将正则表达式规则与其他规则一起使用时。它应该是最后一条规则,并且应该用双竖线字符分隔,如 || . 这是为了适应正则表达式模式中管道字符的潜在存在:
清单 3.3 正则表达式模式:

Map rules = new HashMap<>();
rules.put("dob", "required||regex:[0-9]{2}-[0-9]{2}-[0-9]{4}");


完整的规则列表可在此处获得。
定义自定义规则
假设我们要添加一个默认不在库中的自定义验证规则,我们可以通过继承 RequestValidator 类并实现RuleValidator接口轻松实现它。
鉴于我们需要添加一条规则以确保用户提供的值以custom_ 开头,首先,我们需要创建一个PrefixRuleValidator 类,该类将实现RuleValidator接口并执行自定义逻辑:
清单 4.1 PrefixRuleValidator.java

public class PrefixRuleValidator implements RuleValidator {


我们需要的下一个组件是一个扩展RequestValidator 的类。 我们将调用这个CustomRequestValidator,而不是库的RequestValidator,来进行我们的检查:
清单 4.2 CustomRequestValidator.java
public class CustomRequestValidator extends RequestValidator {
static {
ruleValidatorMap.put("customprefix", PrefixRuleValidator.class);
}
public static List validate(Object target, Map rules) {
String jsonRequest = convertObjectRequestToJsonString(target);
return validate(jsonRequest, rules, ruleValidatorMap);
}
}
CustomRequestValidator的结构很简单,我们将PrefixRuleValidator类静态添加到父级的ruleValidatorMap中。然后我们继续创建父级的validate()方法的副本,这将有效地使我们的规则与其他默认规则一起可用。
最后,让我们在控制器中使用我们的自定义规则:
清单 4.3 CustomPrefixController.java
@RestController
public class CustomPrefixController {
@PostMapping("/custom")
public ResponseEntity formCustomPrefix(@RequestBody Map request) {
Map rules = Collections.singletonMap("objectType", "customprefix");
List errors = CustomRequestValidator.validate(request, rules);
if(!errors.isEmpty()) {
GenericResponse genericResponse = new GenericResponse();
genericResponse.setStatus(false);
genericResponse.setCode(HttpStatus.BAD_REQUEST.value());
genericResponse.setErrors(errors);
genericResponse.setMessage("Missing required parameter(s)");
return ResponseEntity.badRequest().body(genericResponse);
}
return ResponseEntity.ok(GenericResponse.generic200ResponseObj("Operation successful"));
}
}
发布有效请求将返回 200 OK:
清单 4.4 Curl请求/响应

Request:
curl --location --request POST 'http://localhost:8080/custom' \
--header 'Content-Type: application/json' \
--data-raw '{
"objectType": "custom_john"
}'
Response:
{
"status": true,
"message": "Operation successful",
"code": 200
}


另一方面,发布无效请求将返回错误消息,如代码清单 4.1 PrefixRuleValidator.java 所示:
清单 4.5 Curl请求/响应

Request:
curl --location --request POST 'http://localhost:8080/custom' \
--header 'Content-Type: application/json' \
--data-raw '{
"objectType": "john"
}'
Response:
{
"status": false,
"message": "Missing required parameter(s)",
"errors": [
"objectType should start with custom_"
],
"code": 400
}


结论
在本文中,我们了解了如何轻松验证 JSON 请求正文并确保 API 使用者发送我们期望的数据以及实际示例。完整的源代码可在GitHub https://github.com/SeunMatt/smattme-tutorials/tree/master/spring-boot-request-validator上获得。快乐编码。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
《庆余年2》惊见80岁台湾影后!完结埋3伏笔…她不怒而威气场碾压

《庆余年2》惊见80岁台湾影后!完结埋3伏笔…她不怒而威气场碾压

ETtoday星光云
2024-06-05 17:42:23
睡觉时出现5种表现,说明身体正在衰老,千万不要不当回事

睡觉时出现5种表现,说明身体正在衰老,千万不要不当回事

番茄健康
2024-06-04 16:25:07
中国气象局:去年5月开始的厄尔尼诺事件已结束,预计到夏季后期将转入拉尼娜状态

中国气象局:去年5月开始的厄尔尼诺事件已结束,预计到夏季后期将转入拉尼娜状态

每日经济新闻
2024-06-05 11:40:08
1-2,0-1!亚洲冠军轰然倒下,世预赛3分垫底,国足10分提前晋级

1-2,0-1!亚洲冠军轰然倒下,世预赛3分垫底,国足10分提前晋级

第一人
2024-06-06 06:34:30
台湾问题根本不是武统与和统的问题了,而是以下这两方面问题

台湾问题根本不是武统与和统的问题了,而是以下这两方面问题

星辰故事屋
2024-05-24 20:01:38
不说人话的发布会,已经失败了一大半

不说人话的发布会,已经失败了一大半

一口老炮
2024-06-05 10:55:01
告别!37岁德约做手术无缘温网 轰370胜历史第一 恐复制费纳悲剧

告别!37岁德约做手术无缘温网 轰370胜历史第一 恐复制费纳悲剧

林小湜体育频道
2024-06-05 19:59:08
谷俊山威胁领导廖锡龙:我让你离开你就得离开,廖是如何回应?

谷俊山威胁领导廖锡龙:我让你离开你就得离开,廖是如何回应?

历史龙元阁
2024-05-28 00:56:55
2名驴友去世!男子临死前微笑,女子正脸照曝光,退休金高刚离岗

2名驴友去世!男子临死前微笑,女子正脸照曝光,退休金高刚离岗

时时有聊
2024-06-05 19:46:34
朝鲜副国级高官叛逃脱北,曝光金家秘闻:酒池肉林、80万买轩尼诗

朝鲜副国级高官叛逃脱北,曝光金家秘闻:酒池肉林、80万买轩尼诗

猫眼观史
2024-03-25 14:31:14
无缘温网!德约科维奇已完成半月板手术,预计至少恢复三周

无缘温网!德约科维奇已完成半月板手术,预计至少恢复三周

懂球帝
2024-06-05 22:41:06
30张伪满洲国宣传画,鼓吹王道乐土,意图给民众洗脑,极具蛊惑性

30张伪满洲国宣传画,鼓吹王道乐土,意图给民众洗脑,极具蛊惑性

文史悦读001
2024-06-04 14:46:30
惠特摩尔再见?火箭拉3方交易,探花签成筹码,22岁全明星要来了

惠特摩尔再见?火箭拉3方交易,探花签成筹码,22岁全明星要来了

领袖阿尔弗图
2024-06-05 22:12:00
英伟达总市值突破3万亿美元

英伟达总市值突破3万亿美元

财联社
2024-06-06 02:42:09
日本建筑公司施工时,还主动给楼下停的车套上防尘罩……

日本建筑公司施工时,还主动给楼下停的车套上防尘罩……

日本物语
2024-06-04 16:39:36
90岁游本昌放弃白玉兰奖,撕掉内娱“王一博们”的最后一张遮羞布

90岁游本昌放弃白玉兰奖,撕掉内娱“王一博们”的最后一张遮羞布

阿芒娱乐说
2024-06-03 20:54:14
5胜3负!中国女排奥运资格告急,蔡斌下课?郎平或回归,朱婷笑了

5胜3负!中国女排奥运资格告急,蔡斌下课?郎平或回归,朱婷笑了

小豆豆赛事
2024-06-05 08:07:24
汪某菲售卖北京豪宅,原来小S说的都是真的,她姐姐买东西很变态

汪某菲售卖北京豪宅,原来小S说的都是真的,她姐姐买东西很变态

圈里的甜橙子
2024-06-04 12:36:06
56岁男子爱上25岁女子,颠鸾倒凤后,女婿杀了他

56岁男子爱上25岁女子,颠鸾倒凤后,女婿杀了他

善莫大焉一诺
2024-04-22 20:45:24
75岁大妈坦言:到了晚年才发现,有存款和退休金,也成了一种负担

75岁大妈坦言:到了晚年才发现,有存款和退休金,也成了一种负担

拾代谈生活
2024-06-04 07:18:50
2024-06-06 08:14:44
墨谈科技
墨谈科技
业务数码玩家.无聊的博主
2940文章数 563关注度
往期回顾 全部

科技要闻

9家车企拿到自动驾驶落地入场券,没特斯拉

头条要闻

俞敏洪称"做得乱七八糟" 东方甄选市值3天蒸发近30亿

头条要闻

俞敏洪称"做得乱七八糟" 东方甄选市值3天蒸发近30亿

体育要闻

赴美试训的崔永熙,表现究竟怎么样?

娱乐要闻

《青春有你》胡文煊被曝孕期出轨

财经要闻

特步和七匹狼世纪联姻,家族身价超600亿元?

汽车要闻

又一个水桶车 试驾新“卷王”极狐阿尔法S5

态度原创

本地
游戏
教育
艺术
数码

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

国服战网正式上线,魔兽世界开服计划即将官宣,这些内容别错过

教育要闻

“像是自己重新经历了一遍高考”,99年数学老师第一次带高三,年龄差小 和学生的沟通也更顺畅。

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

数码要闻

Apple Watch和AirPods虽在市场上节节败退 但仍统治着可穿戴设备市场

无障碍浏览 进入关怀版