为了账号安全,请及时绑定邮箱和手机立即绑定

模板破坏 http HEAD 方法

模板破坏 http HEAD 方法

Go
繁星淼淼 2021-06-15 21:25:54
考虑以下代码:当我 GEThttp://localhost:8080/或http://localhost:8080/foo一切按预期工作时。但是当我使用 HEAD http 方法时,http://localhost:8080/foo工作但http://localhost:8080/中断(主程序退出,我收到此错误:'template: main.html:1:0: execution "main.html" at <"homeHandler">: http: request方法或响应状态代码不允许正文')。这两者之间的区别在于一种情况下使用模板 ( /) 而另一种情况下使用简单字符串 ( /foo)。在我的代码中,我广泛使用模板,所以看起来我必须明确要求该方法并返回“200”(或适当的代码)。有没有办法让模板和 HEAD 方法的自动处理?我尝试了这些测试:curl http://localhost:8080/foo -I(-I用于HEAD方法)。package mainimport (    "html/template"    "log"    "net/http")var (    templates *template.Template)// OK, HEAD + GET work finefunc fooHandler(w http.ResponseWriter, req *http.Request) {    w.Write([]byte("fooHandler"))}// GET works fine, HEAD results in an error:// template: main.html:1:0: executing "main.html" at <"homeHandler">://   http: request method or response status code does not allow bodyfunc homeHandler(w http.ResponseWriter, req *http.Request) {    err := templates.ExecuteTemplate(w, "main.html", nil)    if err != nil {        log.Fatal(err)    }}func main() {    var err error    templates, err = template.ParseGlob("templates/*.html")    if err != nil {        log.Fatal("Loading template: ", err)    }    http.HandleFunc("/", homeHandler)    http.HandleFunc("/foo", fooHandler)    http.ListenAndServe(":8080", nil)}main.html子目录中的文件templates就是这个字符串:homeHandler
查看完整描述

1 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

错误是不言自明的:

请求方法或响应状态码不允许正文

HEAD 请求仅允许将 HTTP 标头作为响应发回。真正的问题是为什么你能够在fooHandler.

编辑:

fooHandler也不会写任何内容,您忽略了它返回的错误,即http.ErrBodyNotAllowed.


查看完整回答
反对 回复 2021-06-21
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信