响应、中间件与错误
如何选择响应的编码方式?
- JSON: API 默认响应; 使用
c.JSON(status, value); - String/Data: 文本或已编码字节; 必须设置正确 Content-Type;
- redirect: 返回 3xx 和 Location; 不用于掩盖 API 错误;
- render: HTML 模板、文件和自定义 JSON 编码按场景配置;
- 空响应: 204 不包含响应体;
中间件如何包裹后续 Handler?
- Middleware: 一个
app.HandlerFunc包住后续请求链;c.Next(ctx)前执行前置逻辑,返回后读取最终结果; - 顺序: 先注册者先进入、后退出;Recovery 需要覆盖可能 panic 的链路;
func AccessLog() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
start := time.Now()
c.Next(ctx)
log.Printf("status=%d elapsed=%s", c.Response.StatusCode(), time.Since(start))
}
}
- Request ID: 生成、校验和传播统一见 官方三方扩展;
如何在失败时终止处理并写出响应?
- 中止链路:
c.Abort()阻止后续 Handler,但不会让当前 Go 函数立刻返回;写响应后仍需return; - 响应所有权: 同一次失败只由边界层写出一次结果;204 不再追加 JSON;
- 错误协议: 状态映射、稳定业务码和脱敏由 统一错误响应 定义;
- Recovery: 将意外 panic 转成 500 并记录堆栈,不能代替正常业务错误处理;