RESTfulAPI规范

restful api url设计规范为(先将此规范记住 后续有详细解释):

/版本/访问控制/域对象

/版本/访问控制/域对象/动作


约束:

域对象 用名词而不是动词

直接使用域对象名 使用/ticket而不是复数/tickets 节省脑力

域对象关系表达 最大不超过2层 /ticket/12/message

正确区分 GET POST PUT DELETE 请求方法

无法用名词+请求方法表述的可以扩展为 /域对象/动词 例如 POST /user/login


restful API 访问控制

用于在网关统一进行访问控制, 访问控制分为

pb - public 所有请求均可访问

pt - protected 需要进行token认证通过后方可访问

df - default 网关进行token认证 并且请求参数和返回结果进行加解密

修改为请求头含有X-Encrypt=v1时,网关对请求结果和返回响应进行v1版本加解密算法( 算法为 base64(aes(body)) ),对请求解密和对响应加密

pv - private 无法通过网关访问 只能微服务内部调用

其他 同pt

restful API 版本以微服务为粒度, 整个微服务进行版本升级

例如一个微服务有如下API

复制代码
GET /v1/pb/user
POST /v1/pb/user
PUT /v1/pb/user

如果 POST /v1/pb/user 需要升级 则将整个微服务/v1升级到/v2, 同时保证版本兼容的api老版本可以继续访问

html 复制代码
GET /v2/pb/user    //等价于 GET /v1/pb/user
POST /v1/pb/user  //标记为已废弃
POST /v2/pb/user
PUT /v2/pb/user   //等价于 PUT /v1/pb/user

代码实现(方法上添加注解):

GET方式{version}可以是任意值,v1,v2均可

java 复制代码
@ApiImplicitParam(name = "version", paramType = "path", allowableValues = DemoAutoConfig.COMPATIBLE_VERSION, required = true)
@GetMapping("/{version}/pb/user")

POST v1 标记为已废弃,但是仍可使用

java 复制代码
@Deprecated
@PostMapping("/v1/pb/user")POST{version}

应是当前版本,只能是v2

java 复制代码
@ApiImplicitParam(name = "version", paramType = "path", allowableValues = DemoAutoConfig.CURRENT_VERSION, required = true)
@PostMapping("/{version}/pb/user")

要求兼容上一个版本 如果当前是 /v3 则 /v2 要求可以正常使用 /v1 不做要求

如果无法兼容 需要通知所有服务消费者 并约定版本火车 一起上线时间

正确使用HTTP返回状态

目前常用http状态码:

200 正常 直接返回所需数据

javascript 复制代码
{
	id: 1234567890, // 分布式ID注意不要超过JavaScript精度
	name: '',
	date: '2022-04-24 14:38:21'//
}

400 请求无效 请求参数不合法 业务异常 等 返回response封装对象n

javascript 复制代码
{
	code: '', // 业务编码 以便前端根据具体编码进行不同操作 例如转账失败:包括 余额不足 自己账户被冻结 对方账户被冻结等业务情况
	msg: '', // 提示消息 提示给用户
	error: '', // 错误消息 开发测试环境才会用到 异常堆栈信息 方便快速定位问题 生产环境关闭
	data: {} // 额外信息 前后端共同约定
}

401 未认证 未登陆

403 无权限 已登陆

500 服务器上述状态码无法描述的其他问题

非200状态码均返回response封装对象


分页 过滤 排序

查询尽量使用GET方式方便使用 如果特别复杂查询可以使用POST /search

请求示例: POST /{version}/pb/demos/search 参见PageRequestPageData 对象

javascript 复制代码
{
	"filter": { //
		"name": "string",
		"phone": "string",
		"updateUserId": "string"
	},
	"group": "", //
	"sort": "", // -desc
	"filed": "", //
	"pageNumber": 1, // 1
	"pageSize": 10, //
	"total": 0 // 00
}

返回值:

javascript 复制代码
{
	"entities": [ //
		{
			"gmtCreate": "2018-10-09T03:21:37.232Z",
			"gmtUpdate": "2018-10-09T03:21:37.232Z",
			"id": 0,
			"name": "string",
			"phone": "string",
			"updateUserId": "string"
		}
	],
	"next": { // APPnext
		"filed": "",
		"filter": {
			"name": "string",
			"phone": "string",
			"updateUserId": "string"
		},
		"group": "",
		"pageNumber": 1,
		"pageSize": 10,
		"sort": "",
		"total": 0
	}
}
相关推荐
这是个栗子16 分钟前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ30 分钟前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香38 分钟前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI1 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second601 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴1 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm1 小时前
linux之线程概念和控制
linux·开发语言·c++
掘金_答案1 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
JackieZhengChina2 小时前
零依赖轻量级JS悬浮提示插件title2tip-js的使用教程
开发语言·javascript·ecmascript
hehelm2 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip