2 回答
TA贡献1830条经验 获得超9个赞
我已经复制了你的情况。邮递员得到代码 200,但服务器结果却是 500。
服务器在收到 post 请求时会调用 c.Next() 来执行 4 个处理程序。顺序如下:
gin.Logger
gin.Recovery
gzip.Gzip(gzip.DefaultCompression)
your handler
这是 gin responseWriter 写入响应头,它只会写入一次头。
func (w *responseWriter) WriteHeaderNow() {
if !w.Written() {
w.size = 0
w.ResponseWriter.WriteHeader(w.status)
}
}
两者都gzip.Gzip(gzip.DefaultCompression)具有gin.Recovery延迟函数来写入响应标头。Golang 的延迟调用按后进先出的顺序执行。所以gzip.Gzip(gzip.DefaultCompression)会将响应头写入 200,并且gin.Recovery不会按预期将响应头写入 500。
所以要解决这个问题,你应该改变处理程序的顺序,并确保gin.Recovery是最后加载的处理程序。
TA贡献1811条经验 获得超6个赞
最后添加恢复中间件似乎可以解决这个问题。
package main
import (
"github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin"
)
func main() {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
r.Use(gin.Logger())
r.Use(gzip.Gzip(gzip.DefaultCompression))
r.Use(gin.Recovery())
r.POST("/test", func(c *gin.Context) {
panic("test") // Server panic and client should receive code 500.
})
r.Run(":8080")
}
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报