0

0

Golang REST API如何设计返回码_接口状态码规范

P粉602998670

P粉602998670

发布时间:2026-01-15 14:47:02

|

775人浏览过

|

来源于php中文网

原创

应使用201而非200创建资源成功时;400用于客户端参数错误,500仅限服务端不可预期故障;需封装统一响应结构,区分httpCode与业务code;panic须用中间件recover并返回标准错误响应。

golang rest api如何设计返回码_接口状态码规范

HTTP 状态码该用 200 还是 201?什么时候必须用 400 而不是 500

REST API 的状态码不是装饰,而是客户端理解响应性质的第一依据。Go 中用 http.StatusOKhttp.StatusCreated 等常量写死返回码,比硬写数字更安全,也避免语义错位。

常见误用:创建资源成功却返回 200(应为 201);参数校验失败返回 500(应为 400);未登录时返回 404(应为 401403,取决于是否暴露资源存在性)。

  • 200:通用成功,适用于 GET、PUT、DELETE 成功且无新资源生成
  • 201:POST 创建成功,且响应体中应含 Location 头指向新资源 URI
  • 204:DELETE 或 PUT 成功但无响应体(如删除后不返回任何 JSON)
  • 400:客户端数据错误(JSON 格式错、字段类型不符、必填字段缺失)
  • 401:认证失败(token 缺失、过期、签名无效),需返回 WWW-Authenticate
  • 403:认证通过但权限不足(如普通用户调管理员接口)
  • 404:资源不存在,且服务端确认该路径/ID 不合法(注意:不要用它隐藏“无权访问”)
  • 422:语义验证失败(如 email 格式正确但已被注册),适合配合 JSON Schema 或自定义规则校验
  • 500:仅当服务端 panic、DB 连接崩、磁盘满等不可预期错误才用;其他如依赖服务超时建议用 503

要不要封装统一的 JSON 响应结构?字段怎么取名

Go 的 HTTP handler 里直接 json.NewEncoder(w).Encode(...) 很快,但缺乏一致性。建议封装一个基础响应结构,避免每个 handler 都重复写 codemessagedata

关键点:不要叫 status(易与 HTTP 状态码混淆),推荐用 code 表业务码,httpCode 表 HTTP 状态码;message 必须是面向前端/调用方的提示,不能是日志级错误堆data 字段在失败时设为 null,不要省略。

立即学习go语言免费学习笔记(深入)”;

type Response struct {
    Code    int         `json:"code"`
    Message string      `json:"message"`
    Data    interface{} `json:"data,omitempty"`
}

func WriteSuccess(w http.ResponseWriter, data interface{}) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    json.NewEncoder(w).Encode(Response{Code: 0, Message: "success", Data: data})
}

func WriteError(w http.ResponseWriter, httpCode, bizCode int, msg string) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(httpCode)
    json.NewEncoder(w).Encode(Response{Code: bizCode, Message: msg, Data: nil})
}

业务错误码(bizCode)怎么设计才不和 HTTP 码冲突又便于前端处理

HTTP 状态码只表达“通信层/协议层”结果,业务逻辑错误(如“余额不足”、“订单已取消”)必须靠自定义 code 字段传递。它和 HTTP 码正交:比如支付失败,HTTP 仍返回 400,但 code1001;数据库异常导致下单失败,HTTP 返回 500code 可设为 5001

魔珐星云
魔珐星云

无需昂贵GPU,一键解锁超写实/二次元等多风格3D数字人,跨端适配千万级并发的具身智能平台。

下载

推荐分段设计:1xxx 表参数/输入错误,2xxx 表业务规则拒绝,3xxx 表资源状态冲突(如并发修改),5xxx 表系统级失败。所有码需集中定义在 const 块或枚举文件中,禁止散落在 handler 里 magic number。

  • 避免用 0 表示失败(容易被前端忽略判断)
  • 不要把数据库错误码(如 MySQL 1062)直接透传给前端
  • 敏感信息(如“密码错误次数已达上限”)需脱敏,前端看到的 message 应和日志中的 detail 分离
  • 前端可通过 code 做精确分支,比如 code === 2001 弹支付失败页,code === 2002 跳余额充值页

中间件里如何统一拦截 panic 并转成标准错误响应

Go HTTP server 遇到 panic 默认会返回 500 + 空白页,既不友好也不符合规范。必须用中间件 recover,并主动写入标准错误响应。

注意:recover 只捕获当前 goroutine 的 panic,若 handler 启了新 goroutine(如 go fn()),需在子 goroutine 内单独 recover;日志中必须保留完整 stack trace,但响应体绝不暴露。

func Recovery() gin.HandlerFunc {
    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                const msg = "internal server error"
                log.Printf("PANIC: %+v\n%s", err, debug.Stack())
                c.AbortWithStatusJSON(http.StatusInternalServerError, Response{
                    Code:    5000,
                    Message: msg,
                    Data:    nil,
                })
            }
        }()
        c.Next()
    }
}

真正难的是区分“可预期错误”和“panic”。比如数据库查询返回 sql.ErrNoRows 是正常流程,不应 panic;而 nil pointer dereference 才是必须 recover 的。别把业务错误兜底全扔给 recovery 中间件。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

389

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号