Golang中fasthttp与hero模板集成问题解决方案
Golang中fasthttp与hero模板集成问题解决方案 我正在将Hero模板集成到FastHTTP中,但localhost:8080显示如下:

但我需要localhost:8080显示如下:
- Alice
- Bob
- Tom
问题是HTML代码被显示出来了。我的app.go文件是:
package main
import (
"bytes"
"log"
"github.com/shiyanhui/hero/examples/app/template"
"github.com/valyala/fasthttp"
)
func main() {
requestHandler := func(ctx *fasthttp.RequestCtx) {
var userList = []string{
"Alice",
"Bob",
"Tom",
}
buffer := new(bytes.Buffer)
template.UserList(userList, buffer)
if _, err := ctx.Write(buffer.Bytes()); err != nil {
log.Printf("ERR: %s\n", err)
}
}
log.Fatal(fasthttp.ListenAndServe(":8080", requestHandler))
}
更多关于Golang中fasthttp与hero模板集成问题解决方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html
6 回复
我不太了解fasthttp,但我觉得你需要设置一个合适的内容类型。
附注:您正在生成三个列表,每个列表仅包含一个项目,这真的是预期的行为吗?
浏览器需要知道您将提供什么类型的内容信息。
在您设置缓冲区之前,需要设置正确的头部:
ctx.SetContentType("text/html; charset=utf8")
设置之后应该就能正常工作了。
package main
import (
"bytes"
"log"
"github.com/shiyanhui/hero/examples/app/template"
"github.com/valyala/fasthttp"
)
这里可以找到更复杂的示例:
valyala/fasthttp/blob/master/examples/helloworldserver/helloworldserver.go
package main
import (
"flag"
"fmt"
"log"
"github.com/valyala/fasthttp"
)
var (
addr = flag.String("addr", ":8080", "TCP address to listen to")
compress = flag.Bool("compress", false, "Whether to enable transparent response compression")
)
func main() {
flag.Parse()
h := requestHandler
if *compress {
此文件已被截断。查看原始文件
问题在于Hero模板生成的代码默认输出到标准输出,而不是直接写入HTTP响应。需要修改模板调用方式,将输出定向到fasthttp.RequestCtx的响应体。
以下是修正后的代码:
package main
import (
"log"
"github.com/shiyanhui/hero/examples/app/template"
"github.com/valyala/fasthttp"
)
func main() {
requestHandler := func(ctx *fasthttp.RequestCtx) {
var userList = []string{
"Alice",
"Bob",
"Tom",
}
// 直接写入到fasthttp的响应体
template.UserListToBuffer(userList, ctx)
}
log.Fatal(fasthttp.ListenAndServe(":8080", requestHandler))
}
如果Hero模板没有提供直接写入fasthttp.RequestCtx的方法,可以创建一个自定义的writer:
package main
import (
"log"
"github.com/shiyanhui/hero/examples/app/template"
"github.com/valyala/fasthttp"
)
// 实现io.Writer接口,直接写入到fasthttp响应体
type fastHTTPWriter struct {
ctx *fasthttp.RequestCtx
}
func (w *fastHTTPWriter) Write(p []byte) (n int, err error) {
return w.ctx.Write(p)
}
func main() {
requestHandler := func(ctx *fasthttp.RequestCtx) {
var userList = []string{
"Alice",
"Bob",
"Tom",
}
// 使用自定义writer
writer := &fastHTTPWriter{ctx: ctx}
template.UserList(userList, writer)
}
log.Fatal(fasthttp.ListenAndServe(":8080", requestHandler))
}
或者使用bytes.Buffer但确保正确设置Content-Type:
package main
import (
"bytes"
"log"
"github.com/shiyanhui/hero/examples/app/template"
"github.com/valyala/fasthttp"
)
func main() {
requestHandler := func(ctx *fasthttp.RequestCtx) {
var userList = []string{
"Alice",
"Bob",
"Tom",
}
buffer := new(bytes.Buffer)
template.UserList(userList, buffer)
// 设置正确的Content-Type
ctx.SetContentType("text/html; charset=utf-8")
ctx.Write(buffer.Bytes())
}
log.Fatal(fasthttp.ListenAndServe(":8080", requestHandler))
}
主要问题是需要确保:
- 正确设置Content-Type为
text/html - 模板输出正确写入HTTP响应体
- 避免HTML代码被当作纯文本显示

