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", "我是后台数据")
}
相关文章
线性代数------矩阵的运算和逆矩阵
线性代数------矩阵的运算和逆矩阵
Kali 换源(国内优质镜像源地址)2023最新
Kali 换源(国内优质镜像源地址)2023最新
5002 0
|
Java 测试技术 持续交付
软件测试的艺术:从新手到专家
【9月更文挑战第35天】在软件开发的舞台上,测试是确保质量的关键步骤。本文将引导你穿越软件测试的迷宫,从基础理论到实践技巧,再到高级策略,揭示如何提升你的测试技能。无论你是初涉测试领域的新手,还是寻求进阶的资深人士,这篇文章都将为你提供宝贵的指导和启示。让我们一同探索软件测试的艺术,学习如何成为这一领域的专家。
|
前端开发 JavaScript Linux
十年跨平台开发,Electron 凭什么占据一席之地?
本文首发于微信公众号“前端徐徐”。作者徐徐将系统整理Electron的相关知识,分享更多开发经验。Electron是一个已有10年历史的跨端开发框架,本文将从其诞生背景、优劣势、生态、案例等方面进行详细介绍,并与其他框架进行对比,帮助读者全面了解Electron。
788 2
十年跨平台开发,Electron 凭什么占据一席之地?
|
Web App开发 前端开发 JavaScript
CSS基础
【8月更文挑战第27天】
96 3
|
存储 弹性计算 Kubernetes
k8s 开通openstack
【2月更文挑战第20天】
364 3
|
IDE 开发工具
一文解决Visual Studio 2022运行时系统找不到指定文件的错误(简单易懂 亲测有用)
一文解决Visual Studio 2022运行时系统找不到指定文件的错误(简单易懂 亲测有用)
5681 0
谈一谈|“互联网+”时代的创新
谈一谈|“互联网+”时代的创新
228 0
|
Java Maven SDN
带你读《ODL技术内幕:架构设计与实现原理》之一:阅读源代码前的准备
ODL不仅仅是一个SDN控制器平台,它还是一个优秀的模型驱动架构实现,以及一个典型的分布式系统设计范例。通过ODL,我们能学习的不仅仅是SDN,也能学到其通用的编程技术及软件架构设计,其分布式系统设计实现也非常值得我们借鉴。
|
编解码 Unix Java
直播软件源码开发千万不能忘的一个知识点
对于直播软件源码开发的技术人员来讲,音视频即时通讯技术是需要熟练掌握的。毕竟像直播这样重视互动和实时性的应用场景,即时通讯可以从中起到很大的配合作用。目前市面上有很多服务商所提供的SDK可以帮助实现这一技术,但是在选择哪一家服务商时还需要多下一些功夫才行。本文主要分享一下开发过程中,音视频即时通讯会涉及哪些技术领域。
直播软件源码开发千万不能忘的一个知识点