GoWeb给客户端响应教程

68 阅读3分钟

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", "我是后台数据")

}