Python开发之 RESTful API简记

一、RESTful API是什么?

REST是一种软件架构风格,可扩展、松耦合。在Web开发中,RESTful API是一种应用程序之间通信的标准方式,用于构建网络应用程序接口。

REST原则六大特点

  1. 无状态:每个请求必须包含处理所需的所有信息,服务器不保存客户端状态(如不使用session)。这使得API简化服务器设计、易于扩展和负载均衡
  2. 统一接口:URI唯一标识资源(如/users/123),通过HTTP方法操作资源(GET/POST/PUT/DELETE),请求/响应包含足够信息描述如何处理,所有 API 都遵循相同的规则和格式;
  3. 客户端-服务器架构:客户端与服务器完全分离;
  4. 可缓存:响应必须显式或隐式标记为可缓存或不可缓存,客户端/中间件可以缓存响应,通过Cache-Control头部缓存存储控制和ETag/Last-Modified缓存验证机制可以实现条件缓存;
  5. 分层系统:客户端不知道是否直接连接最终服务器还是中间层;
  6. 按需代码(可选服务):服务器可以临时扩展客户端功能(如返回JavaScript代码),唯一非强制约束;

前五个是REST必须遵守的约束,后一个是可选的约束。

API的功能

  1. 系统解耦:让客户端和服务器完全分离,可以独立开发;
  2. 数据交换:让不同系统之间能够传递信息;
  3. 功能复用:不用重复造轮子,可以直接使用现成的模块;
  4. 安全控制:控制谁可以访问什么数据;

二、怎么写

路由设计命名规范

  • 使用名词复数,不使用动词
  • 使用小写字母和连字符(-),避免文件扩展名

现代RESTful API主要是使用JSON数据格式来传递数据。统一的响应格式如下:

1.资源集合请求

请求

GET /api/v1/products?page=1&limit=5 HTTP/1.1
Accept: application/json

响应

{
  "success": true,
  "code": 200,
  "data": [
    {
      "id": "p001",
      "name": "无线鼠标",
      "price": 99.99,
      "stock": 50
    },
    {
      "id": "p002",
      "name": "机械键盘",
      "price": 299.99,
      "stock": 30
    }
  ],
  "meta": {
    "page": 1,
    "limit": 5,
    "total": 2
  },
  "timestamp": "2025-06-17T10:00:00Z"
}

2.单个资源请求

请求

GET /api/v1/products/p001 HTTP/1.1
Accept: application/json

响应

{
  "data": {
    "id": "p001",
    "type": "products",
    "attributes": {
      "name": "Wireless Mouse",
      "price": 29.99,
      "stock": 150,
      "description": "Ergonomic wireless mouse with 2-year battery life"
    },
    "relationships": {
      "category": {
        "data": { "id": "c12", "type": "categories" },
        "links": {
          "related": "/api/v1/categories/c12"
        }
      }
    },
    "links": {
      "self": "/api/v1/products/p001"
    }
  },
  "included": [
    {
      "id": "c12",
      "type": "categories",
      "attributes": {
        "name": "Computer Accessories"
      }
    }
  ]
}

3.创建资源

请求

POST /api/v1/products HTTP/1.1
Content-Type: application/json

{
  "name": "蓝牙耳机",
  "price": 199.99,
  "stock": 100
}

响应

//成功
{
  "success": true,
  "code": 201,
  "data": {
    "id": "p003",
    "name": "蓝牙耳机",
    "price": 199.99,
    "stock": 100
  },
  "links": {
    "self": "/api/v1/products/p003"
  },
  "timestamp": "2025-06-17T10:05:00Z"
}

//失败
{
  "success": false,
  "code": 400,
  "error": {
    "type": "validation_error",
    "message": "价格不能为负数",
    "details": {
      "field": "price",
      "rule": "min:0"
    }
  },
  "timestamp": "2025-06-17T10:06:00Z"
}
  1. data 数组:包含返回的核心资源数据;
  2. meta 对象:提供与数据集合相关的元信息,如total: 总记录数、page: 当前页码、per_page: 每页显示数量等;
  3. links 对象:实现HATEOAS(超媒体作为应用状态引擎)、self: 当前请求的完整URL、next: 下一页数据的访问URL(当page=1时指向第2页)等。

如果有未来升级为WebSockets协议等非HTTP协议的打算,最好显式在 JSON 响应中加入 success 字段、保留 HTTP 状态码(便于现有 HTTP 客户端)、统一错误格式(如 code + message)等。

基础路由结构参考

// 产品相关
GET    /api/v1/products                  // 获取产品列表
GET    /api/v1/products/{id}              // 获取特定产品
POST   /api/v1/products                  // 创建新产品
PUT    /api/v1/products/{id}              // 全量更新产品信息
DELETE /api/v1/products/{id}              // 删除产品

// 分类相关
GET    /api/v1/categories              // 获取全部分类
GET    /api/v1/categories/{id}/products   // 获取分类下的产品列表

常见网络状态码合集
1xx(信息性状态码)表示临时响应,客户端应继续等待或处理请求
2xx(成功状态码)表示请求已被成功处理
3xx(重定向状态码)表示需要客户端进一步操作以完成请求
4xx(客户端错误状态码)表示客户端请求有误
5xx(服务器错误状态码)表示服务器处理请求时出错

100 Continue:服务器已收到请求头,客户端应继续发送请求体1。
101 Switching Protocols:服务器同意客户端请求,切换协议(如HTTP升级到WebSocket)1。
102 Processing(WebDAV):服务器已接收请求但仍在处理,避免客户端超时1。

200 OK:请求成功,响应中包含请求的数据1。
201 Created:请求成功且服务器创建了新资源(如POST请求)1。
202 Accepted:请求已接受但尚未处理完成(适用于异步任务)1。
204 No Content:请求成功,但响应无返回内容(如DELETE请求)1。
206 Partial Content:服务器成功返回部分数据(如断点续传)1。

301 Moved Permanently:资源已永久重定向至新URL1。
302 Found(临时重定向):资源暂时移至新URL,后续请求仍用原地址1。
304 Not Modified:客户端缓存未过期,服务器未返回新内容1。
307 Temporary Redirect:类似302,但要求HTTP方法不变1。
308 Permanent Redirect:类似301,但要求HTTP方法不变1。

400 Bad Request:请求语法错误,服务器无法解析1。
401 Unauthorized:请求需身份验证(如未登录)1。
403 Forbidden:服务器理解请求但拒绝执行(如权限不足)1。
404 Not Found:请求的资源不存在1。
405 Method Not Allowed:请求方法(如GET/POST)不被允许1。
429 Too Many Requests:客户端发送请求过多(限流)1。

500 Internal Server Error:服务器内部错误(如代码异常)1。
502 Bad Gateway:代理服务器从上游收到无效响应1。
503 Service Unavailable:服务器暂时不可用(如过载或维护)1。
504 Gateway Timeout:代理服务器等待上游响应超时1。
505 HTTP Version Not Supported:服务器不支持请求的HTTP协议版本1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值