golang web框架——gin使用教程|青训营笔记

253 阅读6分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第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数据库?

  1. 数据库,它是按照数据结构组织,存储和管理数据的仓库。
  2. 数据库管理系统, 指数据库系统中对数据进行管理的软件系统。 默认的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")