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月前
|
人工智能 自然语言处理 BI
阿里云短信服务 Skill 发布:Agent 一句话搞定群发
阿里云短信服务Skill正式发布!支持资质/签名/模板查询、短信发送、记录查询及数据统计,运营人员通过自然语言即可在AI Agent中完成全流程操作,无需技术背景,告别繁琐控制台操作,提升通知与营销短信执行效率。
383 5
|
6月前
|
存储 人工智能 开发工具
Claude Code自动记忆来了!配合老金三层记忆系统全开源!加强Plus!
昨天晚上,老金我照例打开 Claude Code 准备写代码。 随便聊了几句项目架构,Claude突然冒出一句: "Based on our previous discussions, this project uses pnpm and TypeScript strict mode." 老金我愣了一下。 上次提到pnpm是三天前的事了,这中间重启了好几次。 打开 ~/.claude/p
|
4月前
|
人工智能 自然语言处理 API
阿里云百炼 Token Plan 是什么?与 Coding Plan 有何区别?
阿里云百炼推出Token Plan(团队版)与Coding Plan(个人版)两大AI订阅服务:前者按Credits统一计费,支持多模态模型及企业级管理;后者按请求次数计费,专注编程场景,成本直观。选对方案,提效更精准。
1810 5
|
4月前
|
Windows
ANSYS 2024安装教程 Windows版:License Manager配置+环境变量+Fluent汉化指南
ANSYS是全球领先的多物理场仿真软件,集成结构、流体、电磁、声学及耦合场分析功能,广泛应用于航空航天、电子、能源等领域。本教程详解ANSYS 2024 R1完整安装、授权配置与中文支持流程。(239字)
|
4月前
|
人工智能 JavaScript API
阿里云百炼Coding Plan最新抢购攻略+OpenClaw保姆级部署教程
阿里云百炼Coding Plan作为面向开发者的AI编码订阅服务,凭借高性价比、多模型聚合与OpenAI兼容接口,成为2026年AI开发领域的热门选择。截至2026年4月,Lite基础版已停止新购,仅Pro进阶版可订阅,且因需求激增,官方采取每日9:30限量补货策略,页面频繁显示“售罄”。
1744 4
|
12月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
安全 API 数据安全/隐私保护
API 接口设计规范
API 接口设计规范
1415 10
|
JSON Cloud Native API
API 规范和设计
今天主要和大家分享的是如何给予 Open API 3.0 标准来设计一套 API 规范。那么整体我们在讲的过程中,大约有以下五方面。 1. 大环境介绍 2. API与服务开放 3. API定义 4. 模型 5. 总结
1816 5