如何为Go API返回结构化错误_Go API错误结构设计指南


Go API结构化错误的核心是统一JSON格式,含Status、Code、Message、Detail(debug模式)、RequestID字段;需分层封装、避免裸error透出,集成HTTP处理器并设正确状态码,支持i18n与错误码文档化。

如何为go api返回结构化错误_go api错误结构设计指南

Go API 返回结构化错误的核心是:统一错误格式、区分错误类型、保留原始上下文、便于前端解析。不建议直接返回 error 字符串或裸 panic,而应设计可序列化、含状态码、错误码、用户提示和调试信息的 JSON 错误响应。

定义标准错误结构体

一个实用的错误结构需包含 HTTP 状态码、业务错误码、用户友好的消息、机器可读的错误 ID(可选)、以及开发用的详细原因(仅 debug 模式暴露):

  • Status:对应 HTTP 状态码(如 400、401、404、500)
  • Code:自定义业务错误码(如 "USER_NOT_FOUND"、"INVALID_EMAIL"),字符串更易维护和国际化
  • Message:面向终端用户的简明提示(如 "用户不存在")
  • Detail:可选字段,仅在 debug=true 时返回(如具体校验失败字段、SQL 错误原文)
  • RequestID:关联日志追踪,方便后端排查

示例结构:

type APIError struct {
    Status    int    `json:"status"`
    Code      string `json:"code"`
    Message   string `json:"message"`
    Detail    string `json:"detail,omitempty"`
    RequestID string `json:"request_id,omitempty"`
}

func (e *APIError) Error() string { return e.Message }

分层封装错误,避免裸 error 透出

不要让数据库错误、JSON 解析错误等底层 error 直接返回给客户端。应在 handler 层统一拦截并转换:

  • 使用中间件或 defer 捕获 panic,并转为 500 类错误
  • 对已知业务错误(如用户未登录、权限不足)主动构造 *APIError
  • 对未知错误(如第三方服务超时、DB 连接失败)统一降级为 500 + 通用码(如 "INTERNAL_ERROR"),不暴露敏感细节
  • 可借助 errors.Is / errors.As 判断错误类型,再做映射(例如识别 pgx.ErrNoRows → 404 + "USER_NOT_FOUND")

与 HTTP 处理器集成(以 net/http 为例)

在 handler 中返回错误时,不直接写 http.Error,而是统一调用一个响应函数:

稿定抠图 稿定抠图

AI自动消除图片背景

稿定抠图 80 查看详情 稿定抠图
  • 成功时:writeJSON(w, http.StatusOK, data)
  • 失败时:writeError(w, err) —— 内部判断是否为 *APIError,否则包装为 500
  • 确保 Content-Type 设为 application/json; charset=utf-8
  • 设置合适的 HTTP 状态码(别让所有错误都返回 200 + {“error”:…})

这样前端可通过 HTTP 状态码快速区分网络/服务异常 vs 业务异常。

可选增强:支持 i18n 与错误码文档化

若需多语言支持,Message 不宜硬编码,可改为 key(如 "user.not_found"),由前端或网关根据 Accept-Language 渲染;同时维护一份公开的错误码表(Markdown 或 OpenAPI x-error-codes 扩展),标注每个 Code 对应的场景、HTTP 状态、是否可重试等,提升协作效率。

基本上就这些。结构化错误不是堆砌字段,而是让错误成为 API 的一部分契约 —— 前端能预期、后端好定位、运维可追踪。

以上就是如何为Go API返回结构化错误_Go API错误结构设计指南的详细内容,更多请关注其它相关文章!


# 前端  # 何为  # 抠图  # 错误码  # 可选  # 加载  # 结构化  # 状态码  # 多语言  # 后端  # app  # 编码  # 处理器  # go  # json  # markdown  # js  # ai  # 金融网站建设模板  # 成都seo推广公司费用  # seo拉丁文  # 工作室网站建设经验  # 沈阳网站建设哪家技术好  # 辣子鸡食品营销推广方案  # 关键词的排名  # 蚌埠关键词排名怎么样  # 美发网络营销推广ppt  # 哪些产品适合网站推广卖  # 文档  # 资源管理 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《爱南宁》认证电动车方法  《百果园》充值余额方法  《豆瓣》私信用户方法  微信如何设置字体大小_微信字体设置的阅读舒适  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  Fedora怎么安装 Fedora Workstation安装步骤  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  如何用mysql开发用户注册登录功能_mysql用户注册登录数据库设计  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  智学网成绩单查询系统网_智学网学生平台登录  QQ网页版入口导航 QQ网页版在线访问通道  《漫蛙manwa2》防走失网页版链接2025  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  解决jQuery多计算器输入字段冲突的教程  Highcharts雷达图轴线交点数值标注指南  如何取消数字签名  Go反射进阶:访问内嵌结构体中的被遮蔽方法  search中maxlength属性用法解析  如何用mysql实现客户反馈管理_mysql客户反馈数据库方法  《火影忍者:木叶高手》快速升级攻略  网易云音乐闹钟铃声设置教程  国际经济与贸易就业方向解析  基于键值条件高效映射 Pandas DataFrame 多列数据  解决Go encoding/json 将JSON大数字解析为浮点数的问题  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  金牛福袋获取攻略  iSpring三分屏制作教程  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  PHP多语言网站的实现:会话管理与翻译函数优化教程  微信朋友圈怎么设置三天可见 微信朋友圈设置指定天数可见步骤【教程】  韩剧圈正版官网入口_韩剧圈官方指定登录  在Django中动态检查模型关联:一种灵活的解决方案  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  《密马》发布账号方法  京东物流快递破损了怎么办_京东快递破损理赔流程  rabbitmq 持久化有什么缺点?  《绿竹漫游》关闭消息通知方法  Win10关闭UAC用户账户控制的方法 Win10降低安全提示等级【技巧】  使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  顺丰速运官网查询入口 顺丰物流查询官网入口链接  圆通快递官方入口不需要登录 在线查询入口快速查询  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  无人机考证官网 中国民航无人机考证官网登录入口  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  《via浏览器》强制缩放网页设置方法 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.