Files
backend/.qoder/repowiki/zh/content/API参考/API参考.md
lan a4b6c5011e
Some checks failed
SonarQube Analysis / sonarqube (push) Has been cancelled
chore(git): 更新.gitignore以忽略新的本地文件
2025-11-30 08:33:17 +08:00

19 KiB
Raw Blame History

API参考

**本文引用的文件** - [routes.go](file://internal/handler/routes.go) - [swagger.go](file://internal/handler/swagger.go) - [auth_handler.go](file://internal/handler/auth_handler.go) - [user_handler.go](file://internal/handler/user_handler.go) - [texture_handler.go](file://internal/handler/texture_handler.go) - [profile_handler.go](file://internal/handler/profile_handler.go) - [captcha_handler.go](file://internal/handler/captcha_handler.go) - [yggdrasil_handler.go](file://internal/handler/yggdrasil_handler.go) - [auth.go](file://internal/middleware/auth.go) - [response.go](file://internal/model/response.go) - [common.go](file://internal/types/common.go)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本API参考面向CarrotSkin后端服务覆盖认证、用户、材质、档案、验证码、Yggdrasil与系统配置等API组。文档基于routes.go与swagger.go中的路由与注释结合各处理器文件的注释与类型定义提供

  • 端点清单与HTTP方法、URL模式
  • 请求/响应模式与鉴权要求JWT
  • 错误码与常见错误场景
  • 参数校验规则与示例
  • 性能优化建议与最佳实践

项目结构

  • 路由注册集中在路由文件,按版本分组与鉴权中间件组合
  • Swagger文档与健康检查在统一入口启用
  • 各功能模块处理器文件通过注释提供OpenAPI规范
  • 中间件负责JWT鉴权与可选鉴权
  • 响应模型与类型定义集中于model与types目录
graph TB
A["Gin引擎"] --> B["Swagger文档<br/>/swagger/*any"]
A --> C["健康检查<br/>/health"]
A --> D["API v1 组<br/>/api/v1"]
D --> E["认证组<br/>/api/v1/auth/*"]
D --> F["用户组<br/>/api/v1/user/*"]
D --> G["材质组<br/>/api/v1/texture/*"]
D --> H["档案组<br/>/api/v1/profile/*"]
D --> I["验证码组<br/>/api/v1/captcha/*"]
D --> J["Yggdrasil组<br/>/api/v1/yggdrasil/*"]
D --> K["系统组<br/>/api/v1/system/*"]

图表来源

章节来源

核心组件

  • 路由注册器:按版本分组,按需挂载鉴权中间件
  • Swagger提供交互式文档与健康检查
  • 鉴权中间件统一从Authorization头解析Bearer Token并注入用户上下文
  • 响应模型:统一的响应结构与分页结构
  • 类型定义:请求/响应结构体与约束规则

章节来源

架构总览

下图展示API调用链与鉴权流程

sequenceDiagram
participant Client as "客户端"
participant Router as "Gin路由"
participant MW as "鉴权中间件"
participant Handler as "处理器"
participant Service as "服务层"
participant DB as "数据库/缓存"
Client->>Router : "HTTP请求"
Router->>MW : "匹配路由并执行中间件"
MW->>MW : "解析Authorization头"
MW->>MW : "校验JWT并注入用户上下文"
MW-->>Router : "通过或拒绝"
Router->>Handler : "转发到对应处理器"
Handler->>Service : "调用业务逻辑"
Service->>DB : "读写数据"
DB-->>Service : "返回结果"
Service-->>Handler : "返回业务结果"
Handler-->>Client : "统一响应结构"

图表来源

详细组件分析

认证组(/api/v1/auth

  • 无需JWT
  • 端点
    • POST /api/v1/auth/register
      • 请求体RegisterRequest
      • 响应LoginResponse含token与用户信息
      • 错误400参数错误、401登录失败
    • POST /api/v1/auth/login
      • 请求体LoginRequest支持用户名或邮箱
      • 响应LoginResponse
      • 错误400参数错误、401登录失败
    • POST /api/v1/auth/send-code
      • 请求体SendVerificationCodeRequest类型枚举register/reset_password/change_email
      • 响应:通用成功响应
      • 错误400参数错误
    • POST /api/v1/auth/reset-password
      • 请求体ResetPasswordRequest验证码6位
      • 响应:通用成功响应
      • 错误400参数错误

参数与校验要点

  • RegisterRequest用户名、邮箱、密码、验证码、可选头像URL
  • LoginRequest用户名或邮箱、密码
  • SendVerificationCodeRequest邮箱、类型
  • ResetPasswordRequest邮箱、验证码、新密码

章节来源

用户组(/api/v1/user需JWT

  • GET /api/v1/user/profile
    • 响应UserInfo
    • 错误401未授权、404用户不存在
  • PUT /api/v1/user/profile
    • 请求体UpdateUserRequest修改密码需同时提供旧密码与新密码
    • 响应UserInfo
    • 错误400参数错误、401未授权、404用户不存在、500服务器错误
  • POST /api/v1/user/avatar/upload-url
    • 请求体GenerateAvatarUploadURLRequest文件名
    • 响应GenerateAvatarUploadURLResponse含post_url、form_data、avatar_url、expires_in
    • 错误400参数错误
  • PUT /api/v1/user/avatar
    • 查询参数avatar_url
    • 响应UserInfo
    • 错误400参数错误
  • POST /api/v1/user/change-email
    • 请求体ChangeEmailRequest新邮箱+验证码)
    • 响应UserInfo
    • 错误400参数错误、401未授权

参数与校验要点

  • UpdateUserRequest头像URL、旧密码、新密码二者需同时提供
  • GenerateAvatarUploadURLRequest文件名必填
  • ChangeEmailRequest新邮箱、验证码

章节来源

材质组(/api/v1/texture

  • 公开端点无需JWT
    • GET /api/v1/texture
      • 查询keyword、typeSKIN/CAPE、public_only、page、page_size
      • 响应分页响应列表项为TextureInfo
    • GET /api/v1/texture/{id}
      • 路径参数id
      • 响应TextureInfo
  • 需JWT端点
    • POST /api/v1/texture/upload-url
      • 请求体GenerateTextureUploadURLRequest文件名、纹理类型
      • 响应GenerateTextureUploadURLResponse含post_url、form_data、texture_url、expires_in
      • 错误400参数错误
    • POST /api/v1/texture
      • 请求体CreateTextureRequest名称、描述、类型、URL、哈希、大小、公开性、是否Slim
      • 响应TextureInfo
      • 错误400参数错误
    • PUT /api/v1/texture/{id}
      • 路径参数id请求体UpdateTextureRequest名称、描述、公开性
      • 响应TextureInfo
      • 错误400参数错误、403无权操作
    • DELETE /api/v1/texture/{id}
      • 路径参数id
      • 响应:通用成功响应
      • 错误400参数错误、403无权操作
    • POST /api/v1/texture/{id}/favorite
      • 路径参数id
      • 响应:布尔值(是否收藏)
      • 错误400参数错误
    • GET /api/v1/texture/my
      • 查询page、page_size
      • 响应分页响应列表项为TextureInfo
    • GET /api/v1/texture/favorites
      • 查询page、page_size
      • 响应分页响应列表项为TextureInfo

参数与校验要点

  • GenerateTextureUploadURLRequest文件名必填、类型枚举SKIN/CAPE
  • CreateTextureRequest名称必填、URL必填且为有效URL、哈希长度64、大小>0、类型枚举
  • UpdateTextureRequest名称长度限制、公开性可选
  • 搜索与分页默认page=1、page_size默认20、最大100

章节来源

档案组(/api/v1/profile

  • 公开端点无需JWT
    • GET /api/v1/profile/{uuid}
      • 路径参数uuid
      • 响应ProfileInfo
      • 错误404档案不存在、500服务器错误
  • 需JWT端点
    • POST /api/v1/profile
      • 请求体CreateProfileRequest名称
      • 响应ProfileInfo含自动生成UUID
      • 错误400参数错误或已达上限、401未授权、500服务器错误
    • GET /api/v1/profile
      • 响应ProfileInfo列表
      • 错误401未授权、500服务器错误
    • PUT /api/v1/profile/{uuid}
      • 路径参数uuid请求体UpdateProfileRequest名称、皮肤ID、斗篷ID
      • 响应ProfileInfo
      • 错误400参数错误、401未授权、403无权操作、404档案不存在、500服务器错误
    • DELETE /api/v1/profile/{uuid}
      • 路径参数uuid
      • 响应:通用成功响应
      • 错误401未授权、403无权操作、404档案不存在、500服务器错误
    • POST /api/v1/profile/{uuid}/activate
      • 路径参数uuid
      • 响应:通用成功响应
      • 错误401未授权、403无权操作、404档案不存在、500服务器错误

参数与校验要点

  • CreateProfileRequest名称长度1-16
  • UpdateProfileRequest名称长度1-16皮肤/斗篷ID可选

章节来源

验证码组(/api/v1/captcha

  • GET /api/v1/captcha/generate
    • 响应主图、滑块图、验证码ID、Y坐标
    • 错误500生成失败
  • POST /api/v1/captcha/verify
    • 请求体:{captchaId, dx}
    • 响应:验证结果(成功/失败)
    • 错误400参数错误、500验证失败

章节来源

Yggdrasil组/api/v1/yggdrasil

  • 元数据
    • GET /api/v1/yggdrasil
      • 响应:实现信息、链接、特性开关、签名公钥、皮肤域名
  • 认证服务
    • POST /api/v1/yggdrasil/authserver/authenticate
      • 请求体AuthenticateRequestagent、clientToken、identifier、password、requestUser
      • 响应AccessToken、ClientToken、SelectedProfile、AvailableProfiles、User可选
    • POST /api/v1/yggdrasil/authserver/validate
      • 请求体ValidTokenRequestaccessToken、clientToken
      • 响应204有效或403无效
    • POST /api/v1/yggdrasil/authserver/refresh
      • 请求体RefreshRequestaccessToken、clientToken、requestUser、selectedProfile
      • 响应新的AccessToken、ClientToken、SelectedProfile、User可选
    • POST /api/v1/yggdrasil/authserver/invalidate
      • 请求体ValidTokenRequestaccessToken、clientToken
      • 响应204
    • POST /api/v1/yggdrasil/authserver/signout
      • 请求体SignOutRequestusername、password
      • 响应204
  • 会话服务
    • GET /api/v1/yggdrasil/sessionserver/session/minecraft/profile/{uuid}
      • 响应:序列化后的档案信息
    • POST /api/v1/yggdrasil/sessionserver/session/minecraft/join
      • 请求体JoinServerRequestserverId、accessToken、selectedProfile
      • 响应204 或错误
    • GET /api/v1/yggdrasil/sessionserver/session/minecraft/hasJoined
      • 查询serverId、username、ip
      • 响应200Profile或204无内容
  • API服务
    • POST /api/v1/yggdrasil/api/profiles/minecraft
      • 请求体:字符串数组(玩家名)
      • 响应Profile列表

参数与校验要点

  • 认证/验证/刷新/登出:均需严格校验请求体字段与类型
  • 会话验证serverId与username必填
  • 批量查询:名称数组非空

章节来源

系统组(/api/v1/system

  • GET /api/v1/system/config
    • 响应:站点名称、描述、注册开关、每用户最大材质数、每用户最大档案数
    • 注意:当前实现为占位返回固定配置

章节来源

依赖分析

  • 路由与中间件
    • 路由文件按组挂载鉴权中间件确保受保护端点仅接受有效JWT
  • 处理器与服务
    • 处理器通过服务层完成业务逻辑,服务层再与数据库/缓存交互
  • 响应与类型
    • 统一响应结构与分页结构,类型定义集中约束参数范围与格式
graph LR
Routes["路由注册<br/>routes.go"] --> MW["鉴权中间件<br/>auth.go"]
MW --> Handlers["各处理器<br/>auth/user/texture/profile/captcha/yggdrasil"]
Handlers --> Services["服务层"]
Services --> DB["数据库/缓存"]
Handlers --> Models["响应模型<br/>response.go"]
Handlers --> Types["类型定义<br/>common.go"]

图表来源

章节来源

性能考虑

  • 上传URL预签名
    • 材质与头像上传URL均采用预签名策略缩短上传路径、降低后端压力
  • 分页与限制
    • 材质与档案列表默认分页,避免一次性返回大量数据
    • 材质与档案数量限制(当前代码中硬编码,建议从配置读取)
  • 缓存与日志
    • Redis用于验证码与公钥等缓存减少数据库压力
    • 日志记录关键错误,便于追踪与优化
  • 并发与超时
    • 建议为外部服务(如对象存储)设置合理超时与重试策略

故障排查指南

  • 鉴权失败
    • 缺少Authorization头或格式不正确401
    • 无效token401
  • 参数错误
    • JSON绑定失败或字段校验不通过400
  • 资源不存在
    • 用户、档案、材质不存在404
  • 权限不足
    • 非本人操作403
  • 服务器错误
    • 数据库异常、外部服务不可用500

章节来源

结论

本API参考基于现有路由与处理器注释梳理了CarrotSkin后端的核心REST接口与鉴权机制。建议在生产环境中

  • 将硬编码限制与默认值迁移至配置中心
  • 引入速率限制与防刷策略
  • 对敏感接口增加审计日志
  • 完善单元测试与集成测试覆盖

附录

统一响应结构

  • 成功响应包含code、message、data
  • 分页响应包含code、message、data、total、page、per_page
  • 错误响应包含code、message、error开发环境

章节来源

常见错误码

  • 200成功
  • 400请求参数错误
  • 401未授权
  • 403禁止访问
  • 404资源不存在
  • 500服务器内部错误

章节来源

Swagger与健康检查

  • 文档地址:/swagger/*any
  • 健康检查:/health

章节来源