3. 接口调用基础:RESTful API 与 HTTP 方法
在工期索赔影响评估中,变更申请与谈判记录的提交、查询、修改与删除,均通过 RESTful API 完成。本节将系统讲解 RESTful 架构的核心概念、HTTP 方法、请求/响应结构及状态码含义,为后续接口调用实战奠定基础。
3.1 RESTful API 简介
REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,而非协议。RESTful API 遵循以下六大约束:
- 客户端-服务器分离:前端与后端独立演进。
- 无状态:每次请求包含全部必要信息,服务器不保存客户端上下文。
- 可缓存:响应可被客户端或中间代理缓存,提升性能。
- 统一接口:资源通过 URI 标识,操作通过标准 HTTP 方法表达。
- 分层系统:客户端无法直接感知是否与最终服务器通信。
- 按需代码(可选):服务器可向客户端传输可执行代码。
工期索赔场景映射: 变更申请单(Change Order)被视为一种“资源”,其 URI 设计为
/api/v1/change-orders/{id},谈判记录(Negotiation Record)作为子资源挂载于 /api/v1/change-orders/{id}/negotiations。
3.2 HTTP 方法(GET / POST / PUT / DELETE)
RESTful API 通过 HTTP 方法表达对资源的操作。在工期索赔系统中,四种核心方法的用途如下:
| HTTP 方法 | CRUD 对应 | 工期索赔场景示例 | 幂等性 | 请求体 |
|---|---|---|---|---|
| GET | 读取(Read) | 查询某变更申请的谈判记录列表 | 是 | 无 |
| POST | 创建(Create) | 提交新的工期索赔变更申请 | 否 | 有 |
| PUT | 全量更新(Update) | 更新谈判记录的全部字段 | 是 | 有 |
| DELETE | 删除(Delete) | 撤销某条无效的变更申请 | 是 | 通常无 |
幂等性要点: 幂等方法(GET/PUT/DELETE)多次调用结果相同,不会产生副作用。POST 非幂等,重复提交可能创建多条重复记录。在工期索赔系统中,建议为 POST 请求加入幂等键(Idempotency-Key)头,防止重复提交。
3.3 请求与响应结构
一个完整的 HTTP 请求包含请求行、请求头、空行和请求体(可选)。响应包含状态行、响应头、空行和响应体。
3.3.1 请求结构示例
POST /api/v1/change-orders HTTP/1.1
Host: api.construction-claims.com
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Idempotency-Key: 7a1b2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d
{
"projectId": "PRJ-2024-001",
"changeOrderType": "TIME_EXTENSION",
"description": "因不可抗力导致基础施工延误14天",
"requestedDays": 14,
"attachments": ["doc-001.pdf", "doc-002.pdf"]
}
3.3.2 响应结构示例
HTTP/1.1 201 Created
Content-Type: application/json
Location: /api/v1/change-orders/CO-2024-0089
X-Request-Id: req-abc123
{
"id": "CO-2024-0089",
"status": "PENDING_REVIEW",
"createdAt": "2024-11-20T14:30:00Z",
"estimatedImpact": {
"delayDays": 14,
"criticalPathAffected": true
}
}
常见错误: 请求头中缺少
Content-Type 会导致服务器无法解析请求体;缺少 Authorization 会返回 401 未授权。在工期索赔系统中,所有写操作(POST/PUT/DELETE)必须携带有效的 JWT 。
3.4 HTTP 状态码含义
状态码由三位数字组成,首位数字表示类别。工期索赔接口调用中常见的状态码如下:
| 状态码 | 类别 | 含义 | 工期索赔场景 |
|---|---|---|---|
| 200 OK | 成功 | 请求成功,响应体包含数据 | GET 查询谈判记录成功 |
| 201 Created | 成功 | 资源创建成功,Location 头指向新资源 | POST 提交变更申请成功 |
| 204 No Content | 成功 | 请求成功,无响应体 | DELETE 删除记录成功 |
| 400 Bad Request | 客户端错误 | 请求格式错误或参数无效 | 请求体缺少必填字段 |
| 401 Unauthorized | 客户端错误 | 未提供或提供了无效的身份凭证 | 过期或未携带 |
| 403 Forbidden | 客户端错误 | 服务器理解请求但拒绝执行 | 用户无权限修改他人提交的变更 |
| 404 Not Found | 客户端错误 | 请求的资源不存在 | 查询不存在的变更申请 ID |
| 409 Conflict | 客户端错误 | 请求与当前资源状态冲突 | 变更申请已审批,无法修改 |
| 422 Unprocessable Entity | 客户端错误 | 请求体语义正确但业务规则校验失败 | 索赔天数超出合同允许上限 |
| 429 Too Many Requests | 客户端错误 | 请求频率超过限流阈值 | 短时间内大量调用接口 |
| 500 Internal Server Error | 服务端错误 | 服务器内部异常 | 数据库连接失败 |
| 503 Service Unavailable | 服务端错误 | 服务器暂时无法处理请求 | 系统维护中 |
3.5 接口调用最佳实践
- 统一错误响应格式:所有错误响应应包含
code、message、details字段,便于客户端统一处理。 - 分页与过滤:GET 列表接口支持
?page=1&size=20&status=PENDING参数,避免一次性返回大量数据。 - 版本控制:在 URI 中嵌入版本号(如
/api/v1/),保证向后兼容。 - 超时与重试:客户端设置合理超时时间(建议 30s),对 5xx 错误采用指数退避重试策略。
- 日志与追踪:每个请求携带
X-Request-Id,便于全链路追踪和问题排查。
工期索赔接口调用检查清单:
✅ 确认接口 URI 和 HTTP 方法正确
✅ 检查请求头:Content-Type、Authorization、Idempotency-Key(写操作)
✅ 验证请求体 JSON 格式与必填字段
✅ 处理响应状态码:2xx 解析数据,4xx 检查参数,5xx 重试
✅ 记录请求 ID 和响应时间,便于审计
✅ 确认接口 URI 和 HTTP 方法正确
✅ 检查请求头:Content-Type、Authorization、Idempotency-Key(写操作)
✅ 验证请求体 JSON 格式与必填字段
✅ 处理响应状态码:2xx 解析数据,4xx 检查参数,5xx 重试
✅ 记录请求 ID 和响应时间,便于审计