这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
Gin框架安装与使用
Gin 是一个用 Go (Golang) 编写的 web框架。 它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。
首先在项目终端下载安装gin包:
go get -u github.com/gin-gonic/gin
下面的示例创建了一个gin router,使用了默认的中间件(logger和recovery)。然后创建了一个"/ping"请求的路由监听。最后启动服务,默认监听8080端口。
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default() // 使用默认中间件(logger和recovery)
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{ // 返回一个JSON,状态码是200,gin.H是map[string]interface{}的简写
"message": "pong",
})
})
r.Run() // 启动服务,并默认监听8080端口
}
RESTful API
REST与技术无关,代表的是一种软件架构风格, 简单来说,REST的含义就是客户端与Web服务器之间进行交互的时候,使用HTTP协议中的4个请求方法代表不同的动作。
GET用来获取资源POST用来新建资源PUT用来更新资源DELETE用来删除资源。 Gin框架支持开发RESTful API的开发。
r := gin.Default()
r.GET("/favorit", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "GET",
})
})
r.POST("/favorit", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "POST",
})
})
r.PUT("/favorit", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "PUT",
})
})
r.DELETE("/favorit", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "DELETE",
})
})
}
开发RESTful API的时候我们通常使用postman或者apipost来作为客户端的测试工具。
获取参数
获取querystring参数
querystring指的是URL中?后面携带的参数(get请求)
//Default返回一个默认的路由引擎
r := gin.Default()
r.GET("/user/search", func(c *gin.Context) {
name := c.DefaultQuery("name", "cjs")
//name := c.Query("name")
address := c.Query("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"name": name,
"address": address,
})
})
r.Run()
}
获取form参数
请求的数据通过form表单来提交(post请求)
//Default返回一个默认的路由引擎
r := gin.Default()
r.POST("/user/search", func(c *gin.Context) {
// DefaultPostForm取不到值时会返回指定的默认值
//name := c.DefaultPostForm("name", "cjs")
name := c.PostForm("name")
address := c.PostForm("address")
//输出json结果给调用方
c.JSON(http.StatusOK, gin.H{
"message": "ok",
"name": name,
"address": address,
})
})
r.Run(":8080")
}
Gin框架中的路由使用
import (
"github.com/gin-gonic/gin"
"fmt"
)
// gin的helloWorld
func main() {
// 1.创建路由
r := gin.Default()
// 路由组1 ,处理GET请求
v1 := r.Group("api/v1")
// {} 是书写规范
{
v1.GET("/register", register)
v1.GET("login", login)
}
v2 := r.Group("api/v2")
{
v2.POST("/register", register)
v2.POST("/login", login)
}
r.Run(":8000") // 开启端口在8000
}
func login(c *gin.Context) {
name := c.DefaultQuery("name", "jack")
c.String(http.StatusOK, fmt.Sprintf("hello %s\n", name))
}
func register(c *gin.Context) {
name := c.DefaultQuery("name", "lily")
c.String(http.StatusOK, fmt.Sprintf("hello %s\n", name))
}
数据响应格式
JSON
json是轻量级数据交互格式,应用很广泛,尤其是Web API服务方面
import (
"github.com/gin-gonic/gin"
"net/http"
)
type User struct {
Uid int `json:"uid" xml:"uid"`
Username string `json:"username" xml:"username"`
}
func main() {
r := gin.Default()
r.GET("test", func(c *gin.Context) {
data := &User{Uid:1,Username:"cjs"}
c.JSON(http.StatusOK,data)
})
r.Run()
}
XML,YAML,String
响应XML、YAML或String格式的数据,处理方式如同JSON一样
r.GET("xml",func(c *gin.Context){
data := gin.H{"xml":"Hello World"}
c.XML(200,data)
})
//yaml
r.GET("yaml",func(c *gin.Context){
data := gin.H{"xml":"Hello World"}
c.YAML(200,data)
})
//string
r.GET("yaml",func(c *gin.Context){
c.String(200,"Hello World")
})
Protobuf
Protobuf是一种与平台无关和语言无关,且可扩展且轻便高效的序列化数据结构的协议,易用性和可阅读性远不如JSON和XML,因此并没有广泛使用。 Gin官方文档描述:
reps := []int64{int64(1), int64(2)}
label := "test"
// protobuf 的具体定义写在 testdata/protoexample 文件中。
data := &protoexample.Test{
Label: &label,
Reps: reps,
}
// 请注意,数据在响应中变为二进制数据
// 将输出被 protoexample.Test protobuf 序列化了的数据
c.ProtoBuf(http.StatusOK, data)
})
连接数据库
什么是mysql数据库?
- 数据库,它是按照数据结构来组织,存储和管理数据的仓库。
- 数据库管理系统, 指数据库系统中对数据进行管理的软件系统。
默认的mysql数据库中存有一个库这个就是mysql的系统数据库,可以对其保存系统的数据包括mysql数据库的信息,数据库root账号,普通账号,以及数据库的名称,还有数据库的一些表还有一些数字型的数据类型结构都会有所保存。
MySQL是基于SQL查询的开源跨平台数据库管理系统。它最初是由瑞典MySQL AB公司开发的。现在它是Oracle Corporation的分支机构。 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
特点:
1.持久化存储数据。
2.方便存储和管理数据
3.使用了统一的方式操作数据库\
SQL的分类
1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT
数据库的三大范式
1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。
使用Go连接mysql数据库
Go原生提供了连接数据库操作的支持,在用 Golang进行开发的时候,如果需要在和数据库交互,则可以使用database/sql包。 初始化数据库连接:
//设置数据库最大连接数
DB.SetConnMaxLifetime(100)
//设置上数据库最大闲置连接数
DB.SetMaxIdleConns(10)
//验证连接
if err := DB.Ping(); err != nil {
fmt.Println("open database fail")
return
}
fmt.Println("connnect success")