Golang代码在HTML页面中无法渲染表单的问题

Golang代码在HTML页面中无法渲染表单的问题 我正在学习官方的Golang教程 https://golang.org/doc/articles/wiki/,现在到了编辑页面的部分;但是,它似乎无法正常工作。 这是我的代码:

func editHandler(w http.ResponseWriter, r *http.Request){
p := loadPage(r.URL.Path[len("/edit/"):])
fmt.Fprintf(w, ` 	<form action="/save/%s" method="POST"> 		<textarea name="body">%s</textarea> 		<button type="submit">Save</button> 	</form> 	`, p.Title, string(p.Body))
}

但出于某种原因,在网站上它显示的是纯HTML。 而当我将所有表单和输入内容改为一个简单的 <h1>Hello World</h1> 时,它突然就正常工作了。

我甚至尝试只写一行 <form>,但它仍然在我的浏览器中显示为纯HTML,并将 反引号 替换为“双引号”。 这到底是什么原因造成的?


更多关于Golang代码在HTML页面中无法渲染表单的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

实际上,我发现了问题所在。 如果我的 Fprintf 字符串不是以 h1 标签开头,它就会返回纯 HTML。 我认为这是一个值得报告的故障,具体应该怎么报告呢?或者这是他们有意为之的?

更多关于Golang代码在HTML页面中无法渲染表单的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我认为这是一个值得报告的故障

不,这不是。对于Web应用程序,你应该了解HTML:W3C HTML

问题出在HTML内容没有正确设置Content-Type头。当浏览器接收到没有明确Content-Type的响应时,可能会将内容当作纯文本处理而不是HTML。

以下是修正后的代码:

func editHandler(w http.ResponseWriter, r *http.Request) {
    p := loadPage(r.URL.Path[len("/edit/"):])
    
    // 设置正确的Content-Type头
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    
    fmt.Fprintf(w, `<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Edit %s</title>
</head>
<body>
    <form action="/save/%s" method="POST">
        <textarea name="body">%s</textarea>
        <button type="submit">Save</button>
    </form>
</body>
</html>`, p.Title, p.Title, string(p.Body))
}

关键修改:

  1. 添加了w.Header().Set("Content-Type", "text/html; charset=utf-8")明确指定内容类型
  2. 添加了完整的HTML文档结构,包括<!DOCTYPE html>声明
  3. 添加了<meta charset="UTF-8">确保字符编码正确

如果问题仍然存在,检查是否有其他中间件或处理程序覆盖了Content-Type头。也可以尝试使用html/template包来更安全地渲染HTML:

import (
    "html/template"
    "net/http"
)

func editHandler(w http.ResponseWriter, r *http.Request) {
    p := loadPage(r.URL.Path[len("/edit/"):])
    
    tmpl := template.Must(template.New("edit").Parse(`
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Edit {{.Title}}</title>
</head>
<body>
    <form action="/save/{{.Title}}" method="POST">
        <textarea name="body">{{printf "%s" .Body}}</textarea>
        <button type="submit">Save</button>
    </form>
</body>
</html>`))
    
    tmpl.Execute(w, p)
}

使用html/template包可以自动处理HTML转义,防止XSS攻击,并且会自动设置正确的Content-Type头。

回到顶部