ResponseWriter
我们先来看下net/http中的ResponseWriter封装了哪些属性和方法。
1.给客户端响应一个字符串
Write([]byte)(int,error) ==>很明显,我们需要提供一个byte的切片,一个字符序列
这一点跟我们上篇文章讲到的,数据在网络中的传递时通过字符序列进行的。
2.给客户端响应一个html页面
// ``中的内容会安照原格式的方式 func Handeler4(w http.ResponseWriter, r *http.Request) { html := `<html> <head> <title>我是响应2</title> </head> <body> 我是响应2,通过html方式的响应 </body> <html> ` w.Write([]byte(html)) }
2.给客户端响应一个html页面(在开发中最常用的方式)
type Header map[string][]string
我们有可以设置响应头中的信息
func Handler5(w http.ResponseWriter, r *http.Request) { //我们也可以设置响应头的信息 w.Header().Set("Content-Type", "Handler5Json") user := User{ ID: 10, Name: "小王", Password: "123abc", } //将user序列化 data, err := json.Marshal(user) if err != nil { fmt.Println("json.Marshal(user) err=", err) } //Marshal返回的就是一个[]byte w.Write(data) }
2.给客户端响应一个重定向
func Handler6(w http.ResponseWriter, r *http.Request) { //必须先指定重定向的位置 w.Header().Set("Location", "https:www.baidu.com") w.WriteHeader(302) }
通过模板引擎响应数据
使用Go的模板引擎一般需要通过3步:1定义模板 2解析模板 3渲染模板(执行模板)
1.定义模板:html文件或者模板文件或字符串
2.解析模板:对文件格式的模板源进行语法分析,创建一个经过语法分析的模板结构,其中模板源头可以是一个字符串,也可以是模板文件中包含的内容
3.渲染模板:执行经过语法分析的模板,将ResponseWriter和模板所需的动态数据传递给模板引擎{{.}},被调用的模板引擎会把经过语法分析的模板和传入的数据结合起来,生成最终的HTML,并将这些HTML传递给ResponseWriter
template包(html/template)实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。
为什么要使用模板引擎呢?
模板引擎可以防止网络攻击,如代码注入。比如某些人在评论区写一个死循环。而模板引擎会自动将输出转化为安全的HTML格式输出,可以抵抗一些网络攻击。
func ParseFiles(filenames ...string) (*Template, error) //解析模板
func (t *Template) Execute(wr io.Writer, data interface{}) error //执行模板
注:每一对请求和响应单独对应一个独立的连接
==>当我们访问一个页面的时候,也是一次请求和响应
(我们在地址栏输入一个网络地址并按回车的时候)
//用来返回html页面的 func HandlerTemplate(w http.ResponseWriter, r *http.Request) { //方式1 //1.定义模板 //2.解析模板 //func ParseFiles(filenames ...string) (*Template, error) tem, err := template.ParseFiles("love.html") if err != nil { fmt.Println("template.ParseFiles err=", err) return } //方式2 //t := template.New("love.html") // //t, _ = t.ParseFiles("love.html") //3.渲染模板 //func (t *Template) Execute(wr io.Writer, data interface{}) error tem.Execute(w, "我是后台数据") }
错误处理:
我们在解析模板时每一对错误进行处理,Go提供一个Must函数专门用来处理这个错误。Must函数可以包裹起一个函数,被包裹的函数会返回一个指向模板的指针和错误,如果错误不是null,那么Must函数将产生一个panic
template.Must(template.ParseFiles(".....string"))*Template
func ParseGlob(pattern string)(*Template,error)
ParseGlob创建一个模板并解析匹配pattern的文件里的模板定义,返回的模板的名字是第一匹配的文件的文件名(不含扩展名),内容为解析后的第一个文件内容。如果发生错误,会停止解析并返回nil ParseFlob等价于使用匹配pattern的文件的列表为参数调用ParseFiles
t,_ := template.ParseGlob("*.html")
执行模板
1).通过Execute方法
func (*Template) Execute
==>如果只有一个模板文件,调用这个方法总是可行的,但是如果有多个模板文件,调用这个方法只能得到第一个模板。
t.ExecuteTemplate(w,"hello.html","我要在hello2.html")
func HandlerTemplate2(w http.ResponseWriter, r *http.Request) { t := template.Must(template.ParseFiles("love.html", "index2.html")) t.ExecuteTemplate(w, "index2.html", "我是后台数据") }