GoWeb给客户端响应教程

简介: GoWeb给客户端响应教程

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", "我是后台数据")
}
相关文章
|
5月前
|
前端开发 API
服务端渲染-nextjs如何发起请求
服务端渲染-nextjs如何发起请求
296 0
|
2月前
|
存储 网络协议 Linux
《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)
《网络是怎么样连接的》读书笔记 - WEB服务端请求和响应(五)
37 0
|
2月前
|
存储 JSON 监控
源码分析Zabbix客户端如何向服务端发起请求
源码分析Zabbix客户端如何向服务端发起请求
29 2
|
6月前
|
Windows
|
7月前
|
存储 JSON BI
如何让 ABAP 服务器能够响应通过浏览器发起的自定义 HTTP 请求的试读版
如何让 ABAP 服务器能够响应通过浏览器发起的自定义 HTTP 请求的试读版
43 0
|
7月前
|
存储 缓存 关系型数据库
1.6 服务器处理客户端请求
1.6 服务器处理客户端请求
43 0
|
9月前
|
JSON PHP 数据格式
响应 方式
响应 方式
|
前端开发
前端学习案例1-web服务中的请求和响应之1
前端学习案例1-web服务中的请求和响应之1
59 0
前端学习案例1-web服务中的请求和响应之1
|
前端开发
前端学习案例2-web服务中的请求和响应之2
前端学习案例2-web服务中的请求和响应之2
41 0
前端学习案例2-web服务中的请求和响应之2
|
前端开发
前端学习案例3-web服务中的请求和响应之3
前端学习案例3-web服务中的请求和响应之3
63 0
前端学习案例3-web服务中的请求和响应之3