框架初识
框架就是一个别人帮我们搭好的舞台,造好了很多现成的工具供我们使用,让开发过程更快速、简洁。
Gin框架介绍
Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。
Gin
是一个用Go语言编写的web框架。它是一个类似于martini
但拥有更好性能的API框架, 由于使用了 httprouter
,速度提高了近40倍。
第一个Gin示例
package mainimport "github.com/gin-gonic/gin"func sayHello(c *gin.Context) {c.JSON(200, gin.H{"message": "Hello golang!",})
}func main() {// 创建一个默认的路由引擎r := gin.Default()// GET:请求方式;/hello:请求的路径// 指定客户端以GET方法请求访问/hello路径时,会执行后面的sayHello函数r.GET("/hello", sayHello)// 启动HTTP服务,默认在0.0.0.0:8080启动服务r.Run(":9090")
}
将上面的代码保存并编译执行,使用浏览器打开127.0.0.1:8080/hello
就能看到一串JSON字符串:
RESTful API
REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer
的简称,中文翻译为“表征状态转移”或“表现层状态转化”。
REST的含义
REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。
- GET用来获取资源
- POST用来新建资源
- PUT用来更新资源
- DELETE用来删除资源
只要API程序遵循了REST风格,那就可以称其为RESTful API。目前在前后端分离的架构中,前后端基本都是通过RESTful API来进行交互。
【案例】图书管理系统
对一本书进行查询、创建、更新和删除等操作:
同样的需求按照RESTful API设计如下:
Gin框架支持开发RESTful API的开发:
func main() {r := gin.Default()// http.StatusOK == 200r.GET("/book", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "GET",})})r.POST("/book", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "POST",})})r.PUT("/book", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "PUT",})})r.DELETE("/book", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "DELETE",})})// 启动服务r.Run(":9090")
}
开发RESTful API的时候我们通常使用 Postman 来作为客户端的测试工具。
Go语言标准库之http/template
html/template包
实现了数据驱动的模板,用于生成可防止代码注入的安全的HTML内容。它提供了和text/template包
相同的接口,Go语言中输出HTML的场景都应使用html/template
这个包。
模板与渲染
在一些前后端不分离的Web架构中,通常需要在后端将一些数据渲染到HTML文档中,从而实现动态的网页(网页的布局和样式大致一样,但展示的内容并不一样)效果。
- 模板:事先定义好的HTML文档文件。
- 模板渲染的作用机制:文本替换操作 - 使用相应的数据去替换HTML文档中事先准备好的标记。
Go语言的模板引擎
Go语言内置了文本模板引擎 text/template
和用于HTML文档的html/template
。
模板引擎的作用机制
- 模板文件通常定义为
.tmpl
和.tpl
为后缀(也可以使用其他的后缀),必须使用UTF8
编码。 - 模板文件中使用{{和}}包裹和标识需要传入的数据。
- 传给模板这样的数据就可以通过点号
.
来访问,如果数据是复杂类型的数据,可以通过{ { .FieldName }}
来访问它的字段。 - 除
{{
和}}
包裹的内容外,其他内容均不做修改原样输出。
模板引擎的使用
定义模板文件
定义模板文件时需要按照相关语法规则去编写。
解析模板文件
上面定义好了模板文件之后,可以使用下面的常用方法去解析模板文件,得到模板对象:
// 解析模板字符串
func (t *Template) Parse(src string) (*Template, error)
// 解析模板文件
func ParseFiles(filenames ...string) (*Template, error)
// 解析很多个模板
func ParseGlob(pattern string) (*Template, error)
当然,也可以使用 func New(name string) *Template 函数
创建一个名为name
的模板,然后对其调用上面的方法去解析模板字符串或模板文件。
模板渲染
渲染模板简单来说就是使用数据去填充模板,当然实际上可能会复杂很多。
func (t *Template) Execute(wr io.Writer, data interface{}) error
func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error
基本示例
定义模板文件
按照Go模板语法定义一个hello.tmpl
的模板文件,内容如下:
<!DOCTYPE html>
<html lang="zh-CN">
<head><title>Hello</title>
</head>
<body>
<p>Hello {{ . }}</p>
</body>
</html>
解析和渲染模板文件
创建一个main.go
文件,在其中写下HTTP server端代码如下:
package mainimport ("fmt""html/template""net/http"
)func sayHello(w http.ResponseWriter, r *http.Request) {// 2. 解析模板t, err := template.ParseFiles("./hello.tmpl")if err != nil {fmt.Printf("Parse template failed, err:%v\n", err)return}// 3. 渲染模板name := "小王子"err = t.Execute(w, name)if err != nil {fmt.Printf("render template failed, err:%v\n", err)return}
}func main() {http.HandleFunc("/", sayHello)err := http.ListenAndServe(":9000", nil)if err != nil {fmt.Printf("HTTP server start failed, err:%v\n", err)return}
效果
将上面的main.go文件编译执行,然后使用浏览器访问 http://127.0.0.1:9000/
: