如何在fasthttp中使用http.ResponseWriter执行HTML模板等?

如何在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)