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
实际上,我发现了问题所在。
如果我的 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))
}
关键修改:
- 添加了
w.Header().Set("Content-Type", "text/html; charset=utf-8")明确指定内容类型 - 添加了完整的HTML文档结构,包括
<!DOCTYPE html>声明 - 添加了
<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头。

