本文档描述了 CRMEB 项目中 API 接口请求的流程、规范、参数设计和响应格式等,旨在统一 API 请求格式,提高 API 的一致性和可维护性。
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户端 │ │ 中间件 │ │ 控制器 │
│ 1. 发起请求 │────▶│ 2. 认证授权 │────▶│ 3. 业务处理 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ 服务层 │
│ 4. 执行逻辑 │
└─────────────────┘
│
▼
┌─────────────────┐
│ 数据层 │
│ 5. 数据操作 │
└─────────────────┘
│
▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户端 │ │ 中间件 │ │ 控制器 │
│ 8. 处理响应 │◀────│ 7. 响应处理 │◀────│ 6. 生成响应 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
| 方法 | 描述 | 幂等性 | 安全性 |
|---|---|---|---|
| GET | 获取资源 | 是 | 是 |
| POST | 创建资源 | 否 | 否 |
| PUT | 更新资源 | 是 | 否 |
| DELETE | 删除资源 | 是 | 否 |
| PATCH | 部分更新资源 | 否 | 否 |
| OPTIONS | 获取资源的可用操作 | 是 | 是 |
| HEAD | 获取资源的元数据 | 是 | 是 |
| 请求头 | 描述 | 示例 |
|---|---|---|
| Accept | 客户端可接受的响应内容类型 | application/json |
| Accept-Encoding | 客户端可接受的编码方式 | gzip, deflate |
| Content-Type | 请求体的内容类型 | application/json |
| Authorization | 认证信息 | Bearer {token} |
| User-Agent | 客户端标识 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 |
| X-Requested-With | 请求类型 | XMLHttpRequest |
| X-Token | 认证令牌(自定义) | your_token_here |
自定义请求头应以 X- 为前缀,如 X-Token、X-Request-ID 等。
| 位置 | 适用场景 | 示例 |
|---|---|---|
| URL 路径 | 资源标识 | /api/v1/user/1 |
| 查询字符串 | 过滤、排序、分页 | /api/v1/user?page=1&limit=10&sort=create_time&order=desc |
| 请求体 | 复杂数据、创建/更新资源 | {"username": "test", "password": "123456"} |
| 请求头 | 认证信息、元数据 | Authorization: Bearer {token} |
| Cookie | 会话信息 | PHPSESSID=your_session_id |
userNamepage、limit、sort| 参数名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| page | int | 页码,默认 1 | page=1 |
| limit | int | 每页数量,默认 10 | limit=20 |
| sort | string | 排序字段 | sort=create_time |
| order | string | 排序方式,asc 或 desc | order=desc |
| keyword | string | 搜索关键词 | keyword=test |
| status | int | 状态过滤 | status=1 |
| start_time | string | 开始时间 | start_time=2024-01-01 |
| end_time | string | 结束时间 | end_time=2024-01-31 |
| 内容类型 | 描述 | 示例 |
|---|---|---|
| application/json | JSON 格式,最常用 | {"username": "test", "password": "123456"} |
| application/x-www-form-urlencoded | 表单格式 | username=test&password=123456 |
| multipart/form-data | 文件上传 | 包含文件和表单字段 |
| text/plain | 纯文本 | 简单的文本数据 |
| application/xml | XML 格式 | test123456 |
示例:
{
"username": "test",
"password": "123456",
"nickname": "测试用户",
"age": 18,
"gender": 1,
"tags": ["tag1", "tag2"],
"address": {
"province": "北京",
"city": "北京",
"district": "朝阳区"
}
}
所有 API 响应应使用统一的 JSON 格式,包含 status、msg 和可选的 data 字段。系统实际调用方式为 app('json')->success()。
// 基本成功响应
return app('json')->success('操作成功', ['id' => 1, 'username' => 'test']);
// 只返回数据,不指定消息
return app('json')->success(['id' => 1, 'username' => 'test']);
// 使用系统内置成功码
return app('json')->success(100000); // 100000 是 "保存成功" 对应的系统内置成功码
{
"status": 200,
"msg": "操作成功",
"data": {
"id": 1,
"username": "test",
"nickname": "测试用户"
}
}
分页响应应包含 total、page、limit 和 list 字段,系统实际调用方式为 app('json')->success()。
// 分页数据响应
$pageData = [
'total' => 100,
'page' => 1,
'limit' => 10,
'list' => [
['id' => 1, 'username' => 'test1', 'nickname' => '测试用户1'],
['id' => 2, 'username' => 'test2', 'nickname' => '测试用户2']
]
];
return app('json')->success('获取列表成功', $pageData);
{
"status": 200,
"msg": "获取列表成功",
"data": {
"total": 100,
"page": 1,
"limit": 10,
"list": [
{
"id": 1,
"username": "test1",
"nickname": "测试用户1"
},
{
"id": 2,
"username": "test2",
"nickname": "测试用户2"
}
]
}
}
系统使用统一的错误响应格式,所有错误响应通过 app('json')->fail() 方法返回。fail() 方法支持两种参数类型:
410025无论使用哪种参数类型,系统都会返回统一的 JSON 格式,包含 status、msg 和可选的 data 字段。当使用错误码时,响应中还会包含 code 字段。
{
"status": 400,
"msg": "账号或密码错误",
"code": 410025,
"data": null
}
// 推荐:使用系统内置错误码
return app('json')->fail(410025);
// 不推荐:直接使用错误消息
return app('json')->fail('账号或密码错误');
// 使用错误码并传递额外数据
return app('json')->fail(410025, ['extra' => 'additional data']);
// 使用错误码并传递替换参数
return app('json')->fail(410025, [], ['field' => 'username']);
data 字段中提供详细信息| 响应码范围 | 类型 | 描述 | 示例 |
|---|---|---|---|
| 200 | 成功 | 操作成功 | 200 |
| 1000-1999 | 系统级错误 | 系统核心错误 | 1001(参数错误) |
| 4000-4999 | 业务级错误 | 具体业务逻辑错误 | 410025(账号或密码错误) |
| 400 | 客户端错误 | 请求参数错误 | 400 |
| 401 | 认证错误 | 未认证或认证过期 | 401 |
| 403 | 权限错误 | 无权限访问 | 403 |
| 404 | 资源错误 | 资源不存在 | 404 |
| 500 | 服务器错误 | 服务器内部错误 | 500 |
错误响应应遵循以下设计原则:
data 字段中提供详细信息CRMEB 系统集成了 AI 自动提示功能,当开发者在编写代码时使用 fail() 方法返回错误信息时,AI 会自动:
// 开发者输入
return $this->fail('登录失败');
// AI 自动提示并替换为
return $this->fail(410019); // 410019 是 "登录失败" 对应的系统内置错误码
fail() 方法传入字符串错误信息时,系统自动在映射表中查找匹配的错误码code 字段当使用字符串错误信息时,系统会自动匹配并转换为错误码,最终响应格式为:
{
"status": 400,
"msg": "登录失败",
"code": 410019
}
当直接使用错误码时,响应格式为:
{
"status": 400,
"msg": "登录失败",
"code": 410019
}
getLang() 函数获取本地化的错误信息对于系统内置错误码无法覆盖的业务场景,可以自定义错误码,但应遵循以下规范:
app('json')->fail() 统一处理错误app('json')->success() 统一返回响应error_code.md 中记录接口使用的错误码/api/v1/user 而不是 /api/v1/getUser/api/v1/users 而不是 /api/v1/user