Skip to content

HTTP and REST API

Phase 03 — Go Web 涵盖:HTTP · REST API


1. 学习目标

完成本知识点后,你应该能够:

  • 理解 HTTP 请求/响应的结构(Method、URL、Header、Body、Status Code)
  • 掌握 REST 资源设计原则和 HTTP 动词语义
  • 设计适合 Vue 前端调用的 JSON API
  • 区分幂等与非幂等操作
  • 为数字孪生场景设计设备、场景等 REST 资源
  • 理解前后端协作中的 API 契约

2. 为什么需要

作为前端开发者,你已 daily 使用 HTTP——axios 发请求、处理状态码、调试 Network 面板。Phase 03 的目标是从服务端实现这些你熟悉的概念。Go REST API 将成为 Vue + Three.js 数字孪生前端的数据来源。

REST 不是技术,而是一种用 HTTP 表达资源操作的架构风格。好的 API 设计让前端可预测、易调试、易扩展。


3. 核心概念

3.1 HTTP 请求结构

GET /api/devices/AGV-001 HTTP/1.1
Host: localhost:8080
Accept: application/json
Authorization: Bearer eyJ...

{ ... body for POST/PUT ... }
部分说明
MethodGET、POST、PUT、PATCH、DELETE 等
URL资源路径 + 查询参数
Header元数据(Content-Type、Authorization)
Body请求体(通常 JSON)

3.2 HTTP 响应结构

HTTP/1.1 200 OK
Content-Type: application/json

{"id":"AGV-001","online":true}

3.3 常见状态码

含义典型场景
200OKGET/PUT 成功
201CreatedPOST 创建成功
204No ContentDELETE 成功
400Bad Request参数错误
401Unauthorized未认证
403Forbidden无权限
404Not Found资源不存在
500Internal Server Error服务端 bug

3.4 REST 原则

  • 资源用名词 URL 表示:/devices/scenes/{id}
  • 动作由 HTTP Method 表达,不用 URL 里的动词
  • 无状态:每个请求包含完整上下文
  • 表述:JSON 是前后端常用格式

3.5 CRUD 映射

操作MethodURL 示例
列表GET/api/devices
详情GET/api/devices/{id}
创建POST/api/devices
全量更新PUT/api/devices/{id}
部分更新PATCH/api/devices/{id}
删除DELETE/api/devices/{id}

4. 基础语法

API 设计示例(文档级,实现见后续知识点):

go
// 设备资源 JSON 结构
type Device struct {
    ID     string  `json:"id"`
    Name   string  `json:"name"`
    Type   string  `json:"type"`   // "agv" | "sensor"
    Online bool    `json:"online"`
    X      float64 `json:"x,omitempty"`
    Y      float64 `json:"y,omitempty"`
}

// 统一响应包装
type Response struct {
    Code    int         `json:"code"`
    Message string      `json:"message"`
    Data    interface{} `json:"data,omitempty"`
}

数字孪生 API 示例

端点Method说明
/api/devicesGET设备列表
/api/devices/{id}GET单设备状态
/api/devices/{id}/positionPATCH更新坐标
/api/scenesGET3D 场景列表
/api/scenes/{id}GET场景配置 JSON

Vue 前端调用:

typescript
const { data } = await axios.get<Device[]>('/api/devices')

5. 代码解析

REST 设计关注资源命名而非代码语法。关键点:

✅ GET  /api/devices/AGV-001
❌ GET  /api/getDevice?id=AGV-001
❌ POST /api/device/delete

查询参数用于过滤、分页、排序,不是资源 ID:

GET /api/devices?type=agv&online=true&page=1&limit=20

POST body 创建资源时,ID 通常由服务端生成:

json
POST /api/devices
{ "name": "Warehouse AGV", "type": "agv" }

201 Created
{ "id": "AGV-004", "name": "Warehouse AGV", ... }

6. JavaScript / TypeScript 对比

概念前端(axios/fetch)Go 服务端
发请求axios.get(url)http.ListenAndServe 接收
请求体data: { ... }json.Decoder(r.Body).Decode
Headerheaders: { ... }r.Header.Get("Authorization")
状态码response.statusw.WriteHeader(404)
错误处理interceptors统一 error handler middleware

关键差异

  1. 前端消费 API,Go 定义并实现 API
  2. 服务端决定状态码和错误格式——应文档化给前端
  3. CORS 是服务端配置的(下一知识点详述)

7. 常见错误

错误 1:URL 里用动词

POST /api/createDevice  // ❌
POST /api/devices       // ✅

错误 2:滥用 POST

所有操作用 POST 会失去 HTTP 语义和缓存能力。

错误 3:200 包裹错误

json
HTTP 200
{"success": false, "error": "not found"}  // ❌ 应返回 404

错误 4:不一致的响应格式

列表有时返回数组,有时返回 { items: [] },增加前端适配成本。

错误 5:缺少 API 版本

/api/v1/devices 便于未来不破坏兼容地升级。


8. 实际应用

数字孪生 — 设备 API

GET    /api/v1/devices              → 全部设备(Three.js 初始化场景)
GET    /api/v1/devices/{id}         → 单设备详情
PATCH  /api/v1/devices/{id}/state   → 更新位置/状态(模拟或 webhook 写入)
GET    /api/v1/scenes/{id}/config   → 场景模型配置

实时位置推送用 WebSocket(Phase 06),REST 负责初始加载和配置管理

与 Vue 协作

  1. 用 OpenAPI / 文档约定字段名(camelCase)
  2. 统一 { code, message, data } 响应
  3. 错误码与前端 toast 映射

9. 深入理解

9.1 幂等性

Method幂等
GET, PUT, DELETE
POST
PATCH视实现而定

网络重试时,幂等操作更安全。

9.2 HATEOAS

完整 REST 包含链接关系。实际项目中 JSON API 很少严格 HATEOAS,够用即可。

9.3 分页设计

json
{
  "data": [...],
  "pagination": { "page": 1, "limit": 20, "total": 156 }
}

或 Header:X-Total-Count

9.4 REST vs GraphQL

本项目路线用 REST + WebSocket,简单直接,适合数字孪生 CRUD + 实时推送模式。


10. 练习

详细题目见 exercises/phase-03-web/01-http-rest-api.md

Level 1 — 基础

练习 1.1:为 Device 资源设计 5 个 REST 端点(含 Method 和 URL)。

练习 1.2:列出每个端点的成功/失败状态码。

练习 1.3:编写 Device JSON 请求/响应示例。

Level 2 — 应用

练习 2.1:设计 Scene 资源的 CRUD API。

练习 2.2:设计带分页和过滤的设备列表 API。

练习 2.3:定义统一错误响应 JSON 格式。

Level 3 — 综合

练习 3.1:设计数字孪生完整 API(devices + scenes + alerts)。

练习 3.2:编写 API 文档(Markdown 表格),供 Vue 团队使用。

Level 4 — 项目实践

练习 4.1:在 workspace/phase-03/http-rest-api/ 编写 API 设计文档 API.md 和 Go struct 定义(无需 HTTP 实现)。


11. 学习检查

  1. GET 和 POST 在 REST 中分别对应什么操作?
  2. 201 和 200 分别在什么场景返回?
  3. 为什么 URL 不应包含动词?
  4. 查询参数和路径参数(/devices/{id})如何分工?
  5. 什么是幂等?为什么 PUT 是幂等的?
  6. 数字孪生场景中 REST 和 WebSocket 如何分工?

12. 下一步

已完成下一知识点关系
HTTP, REST APInet/http, Handler, Router用 Go 代码实现设计的 API
Middleware, Validation, CORS完善 API 横切关注点

概念已熟悉的话可快速过本文档,重点放在下一节的 Go 服务端实现。


学习导航

上一篇:Sync and Context · 对应练习 · 下一篇:net/http、Handler、Router