API 接口命名规范

简介: 本规范定义FastAPI接口命名与开发标准:URL用kebab-case复数路径;HTTP方法严格语义化;字段用snake_case,布尔值加is_/has_前缀;特殊操作走POST+动作名;版本置于URL;错误码分模块管理;代码层统一DTO、响应结构及异常处理。(239字)

一、核心命名基础规则

这是所有接口必须遵循的底层约定,统一路径、方法、字段的基础标准,保证接口具备自解释能力。

URL 路径规范

资源统一用名词复数表示集合,单体资源拼接 /{id},如 /users、/users/123,禁止动词开头、单复数混用

多单词采用 kebab-case(短横线分隔)全小写格式,如 /user-orders

从属关系通过路径嵌套体现,层级不超过 3 级,如 /orders/{order_id}/items

全局统一前缀格式:/api/版本号/业务资源

HTTP 方法语义 严格用 HTTP 方法对应业务动作,禁止全接口用 POST、用 GET 执行写操作:

GET:查询资源

POST:新增资源

PUT:全量更新资源

PATCH:部分更新资源

DELETE:删除资源

参数字段规范

查询参数、请求 / 响应字段统一采用 snake_case 风格,与 Python 原生编码习惯一致

布尔字段统一加 is/has 前缀,列表响应固定为 list + total 结构

禁用拼音、无意义自造缩写、中英文混合命名

二、场景化与兼容规范

针对非标准 CRUD 业务、接口迭代、异常响应等场景补充约定,覆盖全业务场景的命名一致性。

特殊动作接口:对资源执行特定状态操作时,采用 POST /资源/{id}/动作名 格式,如 POST /users/123/disable、POST /orders/123/pay

批量操作:在集合资源下新增 batch-xxx 路径,如 POST /users/batch-delete

版本控制:采用 URL 路径大版本方案,如 /api/v1/users、/api/v2/users,小功能迭代不升级版本号

错误响应规范:HTTP 状态码精准对应错误类型;业务错误码按模块分段管理(通用 1xxxx、用户 2xxxx、订单 3xxxx),错误信息语义明确,禁止模糊提示

三、Python FastAPI 落地代码

接口路由定义

from fastapi import APIRouter, Query, Depends, HTTPException
from pydantic import BaseModel, Field
from typing import Optional, List, Any

# ==================== 1. 统一返回结构 & DTO 定义 ====================

class Result(BaseModel):
    """统一响应结构"""
    code: int = 200
    message: str = "success"
    data: Optional[Any] = None

class PageResult(BaseModel):
    """分页响应结构"""
    list: List[Any] = []
    total: int = 0

class UserCreateDTO(BaseModel):
    """创建用户入参"""
    username: str = Field(..., min_length=3, max_length=20, description="用户名")
    email: str = Field(..., description="用户邮箱")
    password: str = Field(..., min_length=6, description="密码")

class UserUpdateDTO(BaseModel):
    """更新用户入参"""
    username: Optional[str] = None
    email: Optional[str] = None

class BatchDeleteDTO(BaseModel):
    """批量删除入参"""
    user_ids: List[int] = Field(..., description="待删除的用户ID列表")


# ==================== 2. 模拟 Service  (实际项目中应抽离到独立文件) ====================

class UserService:
    @staticmethod
    def list_users(page_num: int, page_size: int, keyword: Optional[str]):
        # TODO: 接入真实数据库查询逻辑
        return PageResult(list=[], total=0)

    @staticmethod
    def get_user_by_id(user_id: int):
        # TODO: 查询数据库,找不到时抛出异常
        return {
   "id": user_id, "username": "test"}

    @staticmethod
    def create_user(dto: UserCreateDTO):
        # TODO: 数据库插入逻辑
        pass

    @staticmethod
    def update_user(user_id: int, dto: UserUpdateDTO):
        # TODO: 数据库更新逻辑
        pass

    @staticmethod
    def delete_user(user_id: int):
        # TODO: 数据库删除逻辑
        pass

    @staticmethod
    def disable_user(user_id: int):
        # TODO: 状态变更逻辑
        pass

    @staticmethod
    def batch_delete_users(dto: BatchDeleteDTO):
        # TODO: 批量删除逻辑
        pass


# ==================== 3. 依赖注入 (鉴权示例) ====================

def get_current_user():
    """模拟获取当前登录用户的依赖注入"""
    # TODO: 解析 Token,校验权限
    return {
   "id": 1, "role": "admin"}


# ==================== 4. Router 控制器层 ====================

router = APIRouter(prefix="/users", tags=["用户管理"])

@router.get("", summary="查询用户列表")
def list_users(
    page_num: int = Query(1, ge=1, description="页码"),
    page_size: int = Query(10, ge=1, le=100, description="每页条数"),
    keyword: Optional[str] = Query(None, description="搜索关键词")
):
    data = UserService.list_users(page_num, page_size, keyword)
    return Result(data=data)

@router.get("/{user_id}", summary="查询单个用户")
def get_user(user_id: int):
    user = UserService.get_user_by_id(user_id)
    if not user:
        raise HTTPException(status_code=404, detail=f"用户 {user_id} 不存在")
    return Result(data=user)

@router.post("", summary="新增用户")
def create_user(body: UserCreateDTO, current_user=Depends(get_current_user)):
    UserService.create_user(body)
    return Result(message="创建成功")

@router.put("/{user_id}", summary="全量更新用户")
def update_user(user_id: int, body: UserUpdateDTO, current_user=Depends(get_current_user)):
    UserService.update_user(user_id, body)
    return Result(message="更新成功")

@router.delete("/{user_id}", summary="删除用户")
def delete_user(user_id: int, current_user=Depends(get_current_user)):
    UserService.delete_user(user_id)
    return Result(message="删除成功")

@router.post("/{user_id}/disable", summary="禁用用户")
def disable_user(user_id: int, current_user=Depends(get_current_user)):
    UserService.disable_user(user_id)
    return Result(message="禁用成功")

@router.post("/batch-delete", summary="批量删除用户")
def batch_delete_users(body: BatchDeleteDTO, current_user=Depends(get_current_user)):
    UserService.batch_delete_users(body)
    return Result(message="批量删除成功")

数据模型定义

from pydantic import BaseModel, Field
from typing import Generic, TypeVar, List, Optional

T = TypeVar("T")


class UserCreateDTO(BaseModel):
    username: str = Field(..., min_length=3, max_length=20)
    phone: str = Field(..., pattern=r"^1[3-9]\d{9}$")
    email: str = Field(..., description="用户邮箱")
    dept_id: int = Field(..., gt=0)
    is_enabled: bool = True


class UserUpdateDTO(BaseModel):
    username: Optional[str] = Field(None, min_length=3, max_length=20)
    phone: Optional[str] = Field(None, pattern=r"^1[3-9]\d{9}$")
    email: Optional[str] = None
    dept_id: Optional[int] = Field(None, gt=0)
    is_enabled: Optional[bool] = None


class BatchDeleteDTO(BaseModel):
    ids: List[int] = Field(..., min_length=1, description="待删除的用户ID列表")


class PageResult(BaseModel, Generic[T]):
    list: List[T] = []
    total: int = 0


class Result(BaseModel, Generic[T]):
    code: int = 200
    message: str = "success"
    data: Optional[T] = None

错误码枚举

from enum import IntEnum


class ErrorCode(IntEnum):
    PARAM_INVALID = 10001
    UNAUTHORIZED = 10002
    USER_NOT_EXIST = 20001
    USER_ALREADY_EXIST = 20002
    ORDER_NOT_EXIST = 30001


ERROR_MESSAGES: dict[ErrorCode, str] = {
   
    ErrorCode.PARAM_INVALID: "参数不合法",
    ErrorCode.UNAUTHORIZED: "未授权访问",
    ErrorCode.USER_NOT_EXIST: "用户不存在",
    ErrorCode.USER_ALREADY_EXIST: "用户名已存在",
    ErrorCode.ORDER_NOT_EXIST: "订单不存在",
}
目录
相关文章
|
2月前
|
人工智能 自然语言处理 API
阿里云百炼Token Plan个人版与团队版详细介绍:核心特性、收费价格及选购策略与常见问题解答
阿里云百炼Token Plan是一款以Credits统一计量的AI大模型订阅服务,分为个人版与团队版两大产品线,适配从个人开发者到企业团队的全场景需求。个人版设Lite、Standard、Pro三档套餐,限时39元/月起,覆盖千问、智谱、DeepSeek等十余款主流多模态模型,集成联网搜索、代码解释器等Harness工具;团队版主打企业级特性,支持席位管控、用量分析,承诺对话数据不用于模型训练,多租户架构保障高峰调用不排队。全系列订阅均兼容Claude Code、OpenClaw等主流AI编程与智能体工具,一份额度即可在多类工具中灵活抵扣使用。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云云原生数据库PolarDB对接使用完全指南:从集群创建到应用集成
本文提供了一份完整的阿里云云原生数据库PolarDB对接使用指南。首先介绍PolarDB的云原生架构(计算存储分离、一写多读)及其核心优势。接着详细讲解控制台创建集群的完整流程,包括计费模式选择、网络与可用区规划、白名单与数据库账号配置。深入解析三种连接地址(主地址、集群地址、自定义地址)的区别与适用场景,并通过JDBC、Python、Spring Boot等多种代码示例演示应用程序如何对接PolarDB。针对数据迁移场景,重点介绍DTS全量+增量迁移方案及零停机迁移最佳实践。在性能优化方面,涵盖数据库代理读写分离配置、事务级连接池、参数调优与慢查询分析。最后阐述云监控告警配置与日常运维要点,
|
5月前
|
存储 人工智能 自然语言处理
团队AI开发神器!阿里云百炼Token Plan:多席位共享Credits,再也不用来回切账号
阿里云百炼Token Plan是面向企业/团队的大模型订阅服务,百炼开通Token:https://t.aliyun.com/U/fPVHqY 以Credits统一计费,支持文本与图像生成模型,多席位共享、预算可控、不超支;兼容主流AI编程及Agent工具,保障数据安全。新用户享7000万免费Tokens。
619 2
|
5月前
|
监控 数据可视化 安全
阿里云Elasticsearch小白入门完全指南(超详细版)
本指南详解阿里云Elasticsearch入门全流程:从注册账号、创建VPC网络和交换机,到购买向量增强版ES实例(8.17.0)、配置Kibana白名单并登录,再到使用Dev Tools创建索引、写入/查询数据(全文、精确、范围等),以及可视化与成本优化建议。
|
前端开发 测试技术 API
2025年API开发必备:10款优秀Postman替代工具大盘点
API测试在现代开发中至关重要,Postman虽为首选,但市场上涌现出许多优秀替代工具。本文精选2025年10款好评如潮的API测试工具:Apifox、Insomnia、Hoppscotch、Paw、Talend API Tester、HTTPie、ARC、Swagger UI、SoapUI和Thunder Client。这些工具各具特色,满足不同需求,如团队协作、开源易用、自动化测试等。无论是简洁轻量还是功能全面,总有一款适合你的团队,助力效率提升。
8915 122
|
安全 API 数据安全/隐私保护
API 接口设计规范
API 接口设计规范
1510 10
|
SQL 前端开发 JavaScript
占位符含义及用法
占位符”这个概念非常常见,涵盖编程、数据库、前端开发、文档模板等多个领域。下面我帮你详细讲解占位符的含义和几类常见用法。
|
人工智能 Cloud Native Java
从云原生视角看 AI 原生应用架构的实践
本文核心观点: • 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。 • API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。 • AI 原生应用对网关的需求超越了传统的路由和负载均衡功能,承载了更大的 AI 工程化使命。 • AI Infra 的一致性架构至关重要,API 网关、消息队列、可观测是 AI Infra 的重要组成。
54734 144
|
数据库
如何解决逻辑删除is_del与数据库唯一约束冲突
如何解决逻辑删除is_del与数据库唯一约束冲突
778 0