跳到主要内容

响应、中间件与错误

如何选择响应的编码方式?​

  • 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))
}
}

如何在失败时终止处理并写出响应?​

  • 中止链路: c.Abort() 阻止后续 Handler,但不会让当前 Go 函数立刻返回;写响应后仍需 return;
  • 响应所有权: 同一次失败只由边界层写出一次结果;204 不再追加 JSON;
  • 错误协议: 状态映射、稳定业务码和脱敏由 统一错误响应 定义;
  • Recovery: 将意外 panic 转成 500 并记录堆栈,不能代替正常业务错误处理;