第3章:RESTful API基础——HTTP协议核心概念

各位同学,今天我们来聊聊RESTful API。说实话,我在风电行业摸爬滚打这么多年,发现很多搞风电的工程师对API这块儿有畏难情绪。其实没那么复杂,你想想看,API说白了就是两个系统之间约定好的沟通方式。就像咱们风电场的中控系统和SCADA系统之间怎么说话,总得有个规矩吧?

我个人习惯把RESTful API比作一个快递系统。你寄快递、查快递、退快递,每个动作都有对应的操作方式。HTTP协议里的GET、POST、PUT、DELETE,就是这些操作方式。咱们一个一个来看。

3.1 HTTP方法:API的四种基本操作

先看个总览表格,心里有个底:

HTTP方法 对应操作 幂等性 典型场景
GET 查询/读取 获取风机实时数据
POST 创建/新增 提交故障报告
PUT 更新/替换 修改风机参数配置
DELETE 删除 删除过期告警记录

GET 是最常用的。比如你要查某台风机当前的发电功率,发个GET请求就行。我在项目中遇到过有人用POST去查数据,结果把数据库搞出了重复记录。记住:查数据就用GET,别整花活。

POST 用来创建新资源。比如风场新装了一台风机,你要把它的信息录入系统。这里有个坑——POST不保证幂等。什么意思?你连续点两次提交,可能会创建两条一模一样的记录。我曾经在调试某风电平台的API时,就因为网络重试机制没处理好,同一个告警事件被插入了三次。

PUT 是整体更新。比如你要把风机编号WF001的额定功率从2MW改成2.5MW,用PUT把整个资源对象传过去。注意,PUT要求你提供完整的资源数据,缺了某个字段,那个字段可能就被清空了。

DELETE 就是删除。嗯,这个没什么好说的,但要注意——很多风电系统的DELETE不是真删除,而是软删除(标记为已删除)。为什么?因为运维审计需要保留历史记录。

3.2 HTTP状态码:API的应答暗号

每次API调用,服务器都会返回一个状态码。这就像两个人对话,你问一句,对方得回一句「收到」或者「不行」。我整理了几个最常用的:

  • 200 OK:一切正常。GET请求成功返回数据,PUT/DELETE操作成功。
  • 201 Created:POST创建成功。通常响应头里会带一个Location字段,指向新资源的URL。
  • 400 Bad Request:你发的东西有问题。比如JSON格式错了,或者缺少必填字段。
  • 401 Unauthorized:没带认证信息,或者认证信息过期了。
  • 403 Forbidden:认证通过了,但你没权限干这事儿。比如普通运维人员想删除核心配置。
  • 404 Not Found:资源不存在。URL写错了,或者ID不对。
  • 500 Internal Server Error:服务器炸了。这通常是后端代码的锅。

避坑指南:我曾经在对接某风电SCADA系统时,对方API文档写的是返回200表示成功,结果实际返回的是201。排查了半天,发现是文档没更新。所以,别完全信文档,用Postman或curl先试一把。

3.3 JSON数据格式:API的通用语言

JSON现在是API通信的事实标准。它轻量、易读,而且几乎所有编程语言都支持。看个风电场景的例子:

{
  "wind_turbine_id": "WF-001",
  "timestamp": "2025-03-15T14:30:00Z",
  "measurements": {
    "power_output_kw": 1850.5,
    "wind_speed_mps": 12.3,
    "rotor_speed_rpm": 14.2,
    "blade_pitch_deg": 8.7
  },
  "status": "running",
  "alarms": []
}

这里有几个要点:

  • 键名用蛇形命名法(snake_case)还是驼峰命名法(camelCase)?我个人习惯用蛇形,因为JSON是从Python生态火起来的,但如果你对接的是Java写的系统,对方可能用驼峰。提前约定好。
  • 时间戳一定要用ISO 8601格式,带时区信息。我见过有人用时间戳整数(毫秒数),结果不同系统间差了8小时。
  • 布尔值用true/false,不要用1/0或者"yes"/"no"。

小技巧:写API时,如果某个字段可能为空,建议用null而不是空字符串""。因为null表示「没有值」,空字符串表示「值是一个空字符串」,语义完全不同。

3.4 API认证机制:谁在敲门?

API不能谁都能调,得有认证。风电系统的数据涉及电网安全,认证更是重中之重。常用的有两种:

API Key

最简单的方式。服务端给你一个字符串,你每次请求都带上它。通常放在请求头里:

GET /api/v1/turbines
Headers:
  X-API-Key: abc123def456

API Key的优点是简单,缺点是安全性一般。因为Key是静态的,一旦泄露,别人就能一直用。我建议只在内部网络或者测试环境用API Key。

Token(令牌)

更安全的方式。你先用用户名密码换取一个临时Token,后续请求都带这个Token。Token有过期时间,通常几小时到几天。看个流程:

// 第一步:获取Token
POST /api/v1/auth/login
Body: {"username": "admin", "password": "xxxx"}
Response: {"token": "eyJhbGciOiJIUzI1NiIs...", "expires_in": 3600}

// 第二步:使用Token
GET /api/v1/turbines/WF-001
Headers:
  Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

现在主流做法是用JWT(JSON Web Token)。它本身包含了用户信息和过期时间,服务器不需要存session,扩展性好。我在做某风电集控平台时,就用的JWT,单点登录、跨系统调用都很方便。

注意:Token一定要用HTTPS传输,否则中间人可以截获。另外,Token过期后要引导用户重新登录,别让用户莫名其妙地看到401错误。

3.5 知识体系总览

下面这张图把本章的核心内容串起来了。你可以把它当作一个速查地图:

RESTful API 核心知识体系 HTTP 方法 GET - 查询数据 POST - 创建资源 PUT - 更新资源 DELETE - 删除资源 状态码 2xx - 成功 4xx - 客户端错误 5xx - 服务端错误 JSON 数据格式 键值对结构 支持嵌套对象 数组与列表 null 与空值 认证机制 API Key - 静态密钥 Token/JWT - 动态令牌 四个核心模块相互配合,构成完整的RESTful API调用基础

好了,这一章的内容就这些。记住,API调用不是什么高深的技术,它就是两个系统之间规规矩矩地说话。你按照规范来,就不会出大问题。下一章咱们会拿一个真实的风电API来练手,到时候你就知道这些东西怎么用了。


公众号:蓝海资料掘金营,微信deep3321