REST API设计咨询:批量数据校验与记录的API方法选型
针对Subjects资源的REST API最优方案
核心需求
- 校验操作:执行操作前校验
subjects列表,需传入request_uid(UUID)和subjects数组 - 记录操作:操作完成后记录
subjects,支持创建/更新,靠request_uid去重,需传入相同参数 - 所有请求必须以
/subjects为前缀
候选方案逐一排查
方案1:记录用POST/PUT /subjects,校验用GET /subjects
直接排除。GET请求的语义是获取资源,和校验操作不匹配;而且大数组放URI里容易触发长度限制,生产环境肯定踩坑。
方案2:记录用PUT /subjects,校验用POST /subjects
不推荐。同一个路径用HTTP方法区分操作,语义混淆(POST通常对应资源创建),后续团队维护时容易搞混两个接口的作用,可读性太差。
方案3:记录用POST/PUT /subjects,校验用POST/PUT /subjects/validate
这是候选里最靠谱的方案,优化后可直接落地:
- 记录请求:用
PUT /subjects。PUT是幂等方法,刚好适配“通过request_uid创建/更新记录”的需求——重复调用同一request_uid的请求不会产生多余副作用,符合REST语义。请求体携带request_uid和subjects数组。 - 校验请求:用
POST /subjects/validate。POST适合触发这类非资源创建的业务操作,请求体传递参数也能避开URI长度问题,路径里的/validate一眼就能看出是校验动作,清晰明了。
更严谨的补充方案
如果追求REST语义的极致严谨,可以把request_uid放入记录请求的路径中:
- 记录请求:
PUT /subjects/{request_uid},请求体只传subjects数组。PUT的语义就是“更新指定标识的资源,不存在则创建”,把request_uid作为资源标识放在路径里,比放请求体更符合REST规范。 - 校验请求:保持
POST /subjects/validate,请求体携带request_uid和subjects数组即可。
请求示例
记录请求(PUT /subjects)
{ "request_uid": "cd8ef6fd-5ea2-4087-9e8b-6ad5104f0096", "subjects": ["fullAbsenceSubject", "damageSubject", "innerShortageSubject", "weightDifferenceSubject"] }
校验请求(POST /subjects/validate)
{ "request_uid": "cd8ef6fd-5ea2-4087-9e8b-6ad5104f0096", "subjects": ["fullAbsenceSubject", "damageSubject", "innerShortageSubject", "weightDifferenceSubject"] }
补充方案的记录请求(PUT /subjects/cd8ef6fd-5ea2-4087-9e8b-6ad5104f0096)
{ "subjects": ["fullAbsenceSubject", "damageSubject", "innerShortageSubject", "weightDifferenceSubject"] }
内容的提问来源于stack exchange,提问作者Resurrect1on-
相关产品推荐
相关产品推荐

