API接口开发完全指南:从设计到安全的实战经验
2026-04-20 00:29:55
分类: 软件定制开发
tags: api接口设计,restful api规范,接口安全认证,api文档规范,前后端分离开发,接口测试工具,api版本管理
字数: 约5800字
---
做软件定制开发,api接口设计是绕不开的核心话题。
很多项目出了问题,追根溯源都是接口设计不规范:前端改了接口参数没通知后端、接口没有权限控制导致数据泄露、版本升级接口不兼容……
今天把我多年做api开发的经验系统整理出来,希望能帮你少踩坑。
---
rest架构的url应该代表"资源",操作通过http方法表示。
错误示例:
get /getuserbyid?id=1
post /createuser
put /updateuser
delete /deleteuser
正确示例:
get /users/1 # 获取id为1的用户
post /users # 创建用户
put /users/1 # 更新用户(全量更新)
patch /users/1 # 更新用户(部分更新)
delete /users/1 # 删除用户
| 方法 | 语义 | 幂等性 |
|------|------|-------|
| get | 查询资源 | 是 |
| post | 创建资源 | 否 |
| put | 全量更新资源 | 是 |
| patch | 部分更新资源 | 是 |
| delete | 删除资源 | 是 |
---
很多开发者不管什么情况都返回200,然后在body里再放一个自定义状态码——这是不规范的。
应该正确使用http状态码:
| 状态码 | 含义 | 使用场景 |
|--------|------|---------|
| 200 ok | 成功 | get/put/patch成功 |
| 201 created | 创建成功 | post成功 |
| 204 no content | 无返回内容 | delete成功 |
| 400 bad request | 请求参数错误 | 参数校验失败 |
| 401 unauthorized | 未认证 | 未登录/token过期 |
| 403 forbidden | 无权限 | 有登录但无访问权限 |
| 404 not found | 资源不存在 | 指定id资源不存在 |
| 500 internal server error | 服务器错误 | 程序异常 |
---
虽然http状态码应该正确使用,但在实际项目中,客户端(前端/app)通常还需要一个业务层面的统一格式:
json
{
"code": 200,
"message": "操作成功",
"data": {
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
},
"timestamp": 1745164800000
}
分页列表响应:
json
{
"code": 200,
"message": "success",
"data": {
"list": [...],
"total": 1000,
"page": 1,
"pagesize": 20,
"totalpages": 50
}
}
---
jwt(json web token)是目前最常用的api认证方案。
流程:
1. 用户登录,服务端验证成功后生成jwt token
2. 客户端把token存在本地(localstorage或cookie)
3. 后续请求在header里带上token:authorization: bearer
4. 服务端验证token合法性,解析出用户信息
jwt token的结构:
header.payload.signature
- header:加密算法类型
- payload:用户id、角色、过期时间等(不要放敏感信息!)
- signature:用密钥签名,防止篡改
注意事项:
- token有效期要合理(普通场景:7天;高安全要求:2小时)
- 提供token刷新机制(token快过期时自动换新token)
- 不要在payload里放密码等敏感信息(payload是base64编码,可解码)
- 使用https(明文传输token很危险)
---
适合需要对接第三方系统(微信登录、企业微信)或者开放平台场景。
oauth 2.0有四种授权模式,最常用的是"授权码模式"(authorization code flow)。
---
参数校验:
所有输入参数必须在服务端校验(不要相信前端传来的任何数据)。
防止:
- sql注入(使用参数化查询,不要拼接sql)
- xss攻击(对输出内容做转义)
- 过大的数值/超长字符串(设置合理的范围限制)
接口限流:
防止恶意用户通过高频请求导致服务崩溃。
实现方式:redis + 滑动窗口算法
java
// 示例:限制同一ip每分钟最多100次请求
@component
public class ratelimiterfilter {
@autowired
private redistemplate
public boolean isallowed(string ip) {
string key = "rate_limit:" + ip;
long count = redistemplate.opsforvalue().increment(key);
if (count == 1) {
redistemplate.expire(key, 60, timeunit.seconds);
}
return count <= 100;
}
}
cors配置:
合理配置跨域资源共享,不要直接设置 access-control-allow-origin: *(允许所有来源)。
---
接口是有生命周期的,老版本不能说废就废,要给客户端足够的迁移时间。
版本管理方案:
方案一:url路径版本(推荐)
/api/v1/users
/api/v2/users
方案二:header版本
accept: application/vnd.myapp.v2+json
方案三:查询参数版本
/api/users?version=2
推荐url路径方案,最清晰,也最容易在nginx层面做版本路由。
版本策略:
- 不破坏现有字段(只新增,不修改/删除)
- 如果必须有破坏性变更,发布新版本(v2),同时维护老版本(v1)
- 老版本提前3个月公告废弃,给客户端迁移时间
- 废弃的版本不立即下线,给一个过渡期(通常6-12个月)
---
好的api文档,是前后端协作效率的保障。
spring boot集成(以spring boot 3 + springdoc为例):
xml
java
// 接口文档注解
@tag(name = "用户管理", description = "用户相关接口")
@restcontroller
@requestmapping("/api/v1/users")
public class usercontroller {
@operation(summary = "获取用户详情", description = "根据用户id获取用户信息")
@parameter(name = "id", description = "用户id", required = true)
@getmapping("/{id}")
public result
// ...
}
}
启动后访问:http://localhost:8080/swagger-ui.html
---
apifox(国内推荐)
集api文档、接口测试、mock数据于一体,团队协作很方便。
postman
老牌接口测试工具,功能强大,国际上用得最多。
httpie
命令行接口测试工具,适合快速测试。
---
数据库查询优化:
- 避免n+1查询(用join或批量查询)
- 合理使用索引(查询字段要有索引)
- 大数据量分页用游标分页,不要用offset(深分页性能很差)
缓存策略:
- 高频读低频写的数据用redis缓存
- 缓存失效时间要合理(不同数据类型不同策略)
- 注意缓存穿透、缓存击穿、缓存雪崩问题
---
api接口设计是软件开发中需要长期积累经验的技能。
遵循规范、保证安全、写好文档——做到这三点,你的api设计就已经超过80%的项目了。
---
发布时间:2026-04-20
关键词:api接口设计,restful规范,jwt认证,接口安全,swagger文档,api版本管理,接口测试

扫一扫
微信客服在线
24小时服务热线
13807814037