如何在fasthttp中使用http.ResponseWriter执行HTML模板等?
I've recently moved from golang net/http to fasthttp owing to rave reviews.
As you know, fasthttp doesn't use (w http.ResponseWriter) but only one syntax which is (ctx *fasthttp.RequestCtx).
I tried using ctx.Write but it didn't work.
So, how can I implement http.ResponseWriter in the code below to excute my html templates? Please also give some explanation so that we could all benefit.
Much Thanks for your help!
package main()
import (
"html/template"
"fmt"
"github.com/valyala/fasthttp"
)
type PageData struct {
Title string
}
func init() {
tpl = template.Must(template.ParseGlob("public/templates/*.html"))
}
m := func(ctx *fasthttp.RequestCtx) {
switch string(ctx.Path()) {
case "/":
idx(ctx)
default:
ctx.Error("not found", fasthttp.StatusNotFound)
}
}
fasthttp.ListenAndServe(":8081", m)
}
func idx(ctx *fasthttp.RequestCtx) {
pd := new(PageData)
pd.Title = "Index Page"
err := tpl.ExecuteTemplate(ctx.write, "index.html", pd)
if err != nil {
log.Println("LOGGED", err)
http.Error(ctx.write, "Internal server error", http.StatusInternalServerError)
return
}
}
我最近由于好评如潮而从golang net / http转到fasthttp。 p> \ n
您知道,fasthttp不使用(w http.ResponseWriter),而仅使用一种语法(ctx * fasthttp.RequestCtx)。 p>
我尝试使用ctx.Write,但没有用。 p>
那么,如何在下面的代码中实现http.ResponseWriter来执行我的html模板? 请也给出一些解释,以便我们都能从中受益。 p>
非常感谢您的帮助! p>
package main()
\ nimport(
“ html / template”
“ fmt”
“ github.com/valyala/fasthttp"
)
type PageData结构{
标题字符串
}
func init(){
tpl = template.Must(template.ParseGlob(“ public / templates / *。html”))
}
m:= func(ctx * fasthttp.RequestCtx){
开关 字符串(ctx.Path()){
case“ /”:
idx(ctx)
默认值:
ctx.Error(“ not found”,fasthttp.StatusNotFound)
}
}
fasthttp.ListenAndServe(“:8081”,m)
}
func idx(ctx * fasthttp.RequestCtx){
pd:= new(PageData)
pd.Title =“索引 页面“
错误:= tpl.ExecuteTemplate(ctx.write,” index.html“,pd)
如果错误!= nil {
log.Println(” LOGGED“,错误)
http.Error (ctx.write,“内部服务器错误”,http.StatusInternalServerError)
返回
}
code> pre>
} p>
div>
*fasthttp.RequestCtx
implements the io.Writer
interface (that's why ctx.Write()
exists), which means that you can simply pass ctx
as the parameter to ExecuteTemplate()
:
tpl.ExecuteTemplate(ctx, "index.html", pd)
Also, the http.Error()
call will not work, since RequestCtx
is not a http.ResponseWriter
. Use the RequestCtx
's own error function instead:
ctx.Error("Internal server error", http.StatusInternalServerError)