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。
RESTful API 核心概念 RESTful API 核心概念 客户端 Web / 移动 / 测试工具 HTTP 请求 RESTful 服务器 无状态 · 统一接口 HTTP 响应 资源(Resource) /change-orders/{id} /negotiations/{id} 核心原则: 每个资源有唯一 URI;使用标准 HTTP 方法操作资源;无状态通信;响应可缓存。

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 服务端错误 服务器暂时无法处理请求 系统维护中
HTTP 请求-响应生命周期与状态码 HTTP 请求-响应生命周期与状态码 客户端 ① 请求 API 网关 限流 · 认证 ② 转发 业务服务 校验 · 处理 ③ 响应 ④ 响应 关键状态码决策点 2xx 成功 200 / 201 / 204 4xx 客户端错误 400 / 401 / 403 / 404 / 409 / 422 / 429 5xx 服务端错误 500 / 502 / 503 • 2xx:正常处理,客户端可解析响应体 • 4xx:客户端需检查请求参数、权限或业务规则 • 5xx:服务端异常,客户端应等待后重试

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 和响应时间,便于审计