全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中处理API调用错误_提供标准化错误响应

Go中处理API错误需统一分类、封装结构化响应并映射HTTP错误:定义APIError结构含code/status/message/details;用中间件统一处理panic和error;按4xx/5xx/业务错误语义化响应;集成validator聚合校验错误到details。

在 Go 中处理 API 调用错误并返回标准化响应,核心是统一错误分类、封装结构化响应体、并在 HTTP 层做一致的错误映射。不建议直接返回原始 error 或 panic,而应将错误转化为可预测的 JSON 响应(如 {"code": 400, "message": "invalid email", "details": {...}})。

定义标准化错误结构

创建一个可序列化的错误响应结构,包含状态码、业务码、用户提示和可选详情:

示例:

type APIError struct {
    Code    int         `json:"code"`    // HTTP 状态码(如 404)
    Status  string      `json:"status"`  // 如 "Not Found"
    Message string      `json:"message"` // 用户友好的提示
    Details interface{} `json:"details,omitempty"`
}

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

// 快捷构造函数
func NewBadRequest(msg string, details ...interface{}) *APIError {
    err := &APIError{
        Code:    http.StatusBadRequest,
        Status:  http.StatusText(http.StatusBadRequest),
        Message: msg,
    }
    if len(details) > 0 && details[0] != nil {
        err.Details = details[0]
    }
    return err
}

统一错误中间件或包装器

避免每个 handler 重复写 json.NewEncoder(w).Encode(...)。推荐使用中间件捕获 panic 和显式错误:

  • http.Handler 包装器,在 defer 中 recover panic,并转为 500 Internal Server Error
  • 约定 handler 返回 error(如 func(w http.ResponseWriter, r *http.Request) error),由包装器统一处理
  • 若返回非 nil error,检查是否为 *APIError;是则按其 Code/Message 渲染;否则视为未预期错误,记录日志并返回 500

区分错误来源并映射到语义化响应

不同错误应有明确归因,便于前端处理和监控:

  • 客户端错误(4xx):参数校验失败(validator 库)、缺失 header、格式错误 —— 用 NewBadRequestNewUnauthorized
  • 服务端错误(5xx):数据库超时、下游 API 不可用、空指针 panic —— 记录完整 error 栈,返回泛化提示(如 "service unavailable"),避免泄露内部信息
  • 业务逻辑错误(常复用 4xx):用户不存在、权限不足、余额不足 —— 使用专属业务码(如 "user_not_found")放入 Details 字段,方便前端分支处理

集成校验与错误收集

对请求体(如 json)做结构化校验时,不要只返回第一个错误。用 github.com/go-playground/validator/v10 收集全部字段错误,再聚合进 APIError.Details

type CreateUserRequest struct {
    Email string `json:"email" validate:"required,email"`
    Age   int    `json:"age" validate:"required,gte=0,lte=120"`
}

// 校验后
if err := validate.Struct(req); err != nil {
    errs := make(map[string]string)
    for _, e := range err.(validator.ValidationErrors) {
        errs[e.Field()] = e.Tag() + " validation failed"
    }
    return NewBadRequest("validation failed", errs)
}


# js  # 前端  # git  # json  # go  # github  # golang  # usb  #   # ai  # 状态码  # api调用  # red  # 中间件  # 封装  # Error  # 指针  # internal  # 空指针  # nil  # 数据库  # http  # 结构化  # 第一个  # 推荐使用  # 并在  # 不存在  # 可选  # 转化为  # 创建一个  # 服务端  # 不可用 


相关文章: 建站之星展会模版如何一键下载生成?  如何在云主机上快速搭建多站点网站?  网站制作新手教程,新手建设一个网站需要注意些什么?  常州自助建站费用包含哪些项目?  建站之星代理费用多少?最新价格详情介绍  如何通过PHP快速构建高效问答网站功能?  盘锦网站制作公司,盘锦大洼有多少5G网站?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星导航如何优化提升用户体验?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  如何实现建站之星域名转发设置?  平台云上自助建站如何快速打造专业网站?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何快速搭建响应式可视化网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  建站之星安装提示数据库无法连接如何解决?  宁波自助建站系统如何快速打造专业企业网站?  h5网站制作工具有哪些,h5页面制作工具有哪些?  用v-html解决Vue.js渲染中html标签不被解析的问题  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  C++如何编写函数模板?(泛型编程入门)  在线教育网站制作平台,山西立德教育官网?  如何构建满足综合性能需求的优质建站方案?  微信推文制作网站有哪些,怎么做微信推文,急?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  建站之星CMS五站合一模板配置与SEO优化指南  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  如何用景安虚拟主机手机版绑定域名建站?  电商网站制作公司有哪些,1688网是什么意思?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  如何通过可视化优化提升建站效果?  ,巨量百应是干嘛的?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  如何通过万网虚拟主机快速搭建网站?  如何在Windows服务器上快速搭建网站?  广州营销型建站服务商推荐:技术优势与SEO优化解析  非常酷的网站设计制作软件,酷培ai教育官方网站?  建站10G流量真的够用吗?如何应对访问高峰?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何快速查询网站的真实建站时间?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  个人网站制作流程图片大全,个人网站如何注销?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何通过虚拟主机空间快速建站?  香港网站服务器数量如何影响SEO优化效果? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。