Golang中fasthttp与hero模板集成问题解决方案

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

Untitled

但我需要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 回复

哇,真是太感谢了

更多关于Golang中fasthttp与hero模板集成问题解决方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我不太了解fasthttp,但我觉得你需要设置一个合适的内容类型。

附注:您正在生成三个列表,每个列表仅包含一个项目,这真的是预期的行为吗?

浏览器需要知道您将提供什么类型的内容信息。 在您设置缓冲区之前,需要设置正确的头部: ctx.SetContentType("text/html; charset=utf8") 设置之后应该就能正常工作了。

package main

import (
	"bytes"
	"log"

	"github.com/shiyanhui/hero/examples/app/template"
	"github.com/valyala/fasthttp"
)

这里可以找到更复杂的示例:

github.com

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))
}

主要问题是需要确保:

  1. 正确设置Content-Type为text/html
  2. 模板输出正确写入HTTP响应体
  3. 避免HTML代码被当作纯文本显示
回到顶部