Go Gin - http "HEAD" 请求方法
Go Gin - http "HEAD" request method
如果传入请求方法在如下所示的中间件中为“HEAD”,我尝试将 http 方法设置为“GET”。
如果我执行 curl -I,Gin 似乎将此识别为“GET”请求,
但它以 404 响应,如附件日志所示(底部)。
我只是想看看如果不在路由器级别实施“HEAD”方法,这是否可行。
有什么建议吗?
func CORS() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
return
}
// set http method to "GET" if an incoming request is "HEAD"
if c.Request.Method == "HEAD" {
c.Request.Method = "GET"
}
c.Next()
}
}
gin's log
由于gin中间件是路由匹配后得到的处理函数,中间件是在路由匹配后执行的,因此中间件无法修改路由匹配方式
通过装饰一层http.Handler(gin.Engine),使用http.Server中间件修改请求方法
注意:'HEAD' 请求没有响应正文。如果'HEAD'转'GET'后有响应体,不符合http协议规范,建议将'Get'处理函数全部注册到'Head' 方法。
func main() {
router := gin.Default()
s := &http.Server{
Addr: ":8080",
Handler: http.Handler(func(w http.ResponseWriter, r *http.Request){
if r.Method == "HEAD" {
r.Method = "GET"
}
router.ServeHTTP(w, r)
}),
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()
}
如果传入请求方法在如下所示的中间件中为“HEAD”,我尝试将 http 方法设置为“GET”。
如果我执行 curl -I,Gin 似乎将此识别为“GET”请求, 但它以 404 响应,如附件日志所示(底部)。
我只是想看看如果不在路由器级别实施“HEAD”方法,这是否可行。 有什么建议吗?
func CORS() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
c.Writer.Header().Set("Access-Control-Allow-Headers", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
return
}
// set http method to "GET" if an incoming request is "HEAD"
if c.Request.Method == "HEAD" {
c.Request.Method = "GET"
}
c.Next()
}
}
gin's log
由于gin中间件是路由匹配后得到的处理函数,中间件是在路由匹配后执行的,因此中间件无法修改路由匹配方式
通过装饰一层http.Handler(gin.Engine),使用http.Server中间件修改请求方法
注意:'HEAD' 请求没有响应正文。如果'HEAD'转'GET'后有响应体,不符合http协议规范,建议将'Get'处理函数全部注册到'Head' 方法。
func main() {
router := gin.Default()
s := &http.Server{
Addr: ":8080",
Handler: http.Handler(func(w http.ResponseWriter, r *http.Request){
if r.Method == "HEAD" {
r.Method = "GET"
}
router.ServeHTTP(w, r)
}),
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()
}