1.安装
go get gopkg.in/gin-gonic/gin.v1
2.基本的架构
2.1 直接调用方案
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
name := c.Query("name")
c.String(http.StatusOK, "Hello %s", name)
})
//默认监听8080
r.Run(":80")
}
2.2 函数方案
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func pings(c *gin.Context) {
name := c.Query("name")
c.String(http.StatusOK, "Hello %s", name)
}
func main() {
r := gin.Default()
r.GET("/ping", pings)
//默认监听8080
r.Run(":80")
}
3.HTTP服务器
3.1 GET参数获取
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func getinfos(c *gin.Context) {
//获取name
name := c.Query("name")
//DefaultQuery 第一个是获取值 第二个参数是默认值
lastname := c.DefaultQuery("lastname", "这是默认值")
c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
func main() {
r := gin.Default()
r.GET("/ping", getinfos)
//默认监听8080
r.Run(":80")
}
3.2 POST参数获取
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func postinfos(c *gin.Context) {
//获取name
name := c.PostForm("name")
//DefaultPostForm 第一个是获取值 第二个参数是默认值
lastname := c.DefaultPostForm("lastname", "这是默认值")
c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
func main() {
r := gin.Default()
r.POST("/postinfos", postinfos)
//默认监听8080
r.Run(":80")
}
3.3 JSON参数获取
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct {
Name string `json:"name"`
Password string `json:"password"`
}
func loginJSON(c *gin.Context) {
json := Login{}
//获取json数据后并解析
if c.BindJSON(&json) == nil {
if json.Name == "root" && json.Password == "root" {
c.JSON(http.StatusOK, gin.H{"status": "登陆成功"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "账号或者密码错误"})
}
}
}
func main() {
r := gin.Default()
// 绑定JSON的例子 ({"name": "manu", "password": "123"})
r.POST("/loginJSON", loginJSON)
//默认监听8080
r.Run(":80")
}
3.4 提交表单获取参数
package main
import (
"github.com/gin-gonic/gin"
)
type Login struct {
Name string `form:"name"`
Password string `form:"password"`
}
func loginFORM(c *gin.Context) {
form := Login{}
//获取form数据后并解析
if c.Bind(&form) == nil {
if form.Name == "root" && form.Password == "root" {
c.JSON(200, gin.H{"status": "登陆成功"})
} else {
c.JSON(203, gin.H{"status": "账号或者密码错误"})
}
}
}
func main() {
r := gin.Default()
r.POST("/loginFORM", loginFORM)
//默认监听8080
r.Run(":80")
}
3.5 文件上传
package main
import (
"github.com/gin-gonic/gin"
"os"
"log"
"io"
"time"
"strconv"
)
//上传文件
func file(c *gin.Context) {
//上传文件名称
file, header, err := c.Request.FormFile("upload")
if err != nil {
c.JSON(200, gin.H{"msg": "文件不得为空"})
return
}
filename := time.Now().Unix()
//创建文件
out, err := os.Create("./public/"+strconv.FormatInt(filename, 10) + ".png")
if err != nil {
log.Fatal(err)
}
defer out.Close()
//复制流文件
_, err = io.Copy(out, file)
if err != nil {
log.Fatal(err)
}
c.JSON(200, gin.H{"msg": "文件" + header.Filename + "已经上传完成,新名字为:" + strconv.FormatInt(filename, 10)})
}
func main() {
r := gin.Default()
r.POST("/file", file)
//默认监听8080
r.Run(":80")
}
3.6 响应输出
package main
import (
"github.com/gin-gonic/gin"
)
type msg struct {
Name string
Message string
Number int
}
func moreJSON(c *gin.Context) {
msg := msg{}
msg.Name = "Lena"
msg.Message = "hey"
msg.Number = 123
// 以下方式都会输出 : {"name": "Lena", "Message": "hey", "Number": 123}
c.JSON(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
c.XML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
c.YAML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
//输出的结构体
c.JSON(200, msg)
c.XML(200, msg)
c.YAML(200, msg)
}
func main() {
r := gin.Default()
r.GET("/moreJSON", moreJSON)
//默认监听8080
r.Run(":80")
}
3.7 嵌套HTML视图
3.7.1 HTML简单输出
package main
import (
"github.com/gin-gonic/gin"
)
func index(c *gin.Context) {
//根据完整文件名渲染模板,并传递参数
c.HTML(200, "live.html", gin.H{
"title": "你就是个二大傻子",
})
}
func main() {
r := gin.Default()
//加载模板
r.LoadHTMLGlob("templates/*")
//定义路由
r.GET("/index", index)
r.Run(":80")
}
live.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>live</title>
</head>
<body>
<h1>11111111111111111</h1>
<h1>{{.title}}</h1>
</body>
</html>
3.7.2 文件的路由定义
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
//定义多文件的路径,使用的是系统的路径(绝对,相对地址都可以)
r.Static("/a", "D:/phpStudy/WWW/go/templates")
r.Static("/b", "./templates")
r.StaticFS("/c",http.Dir("./templates"))
r.StaticFS("/d",http.Dir("D:/phpStudy/WWW/go/templates"))
//定义单个文件的路径,使用的是绝对路径
r.StaticFile("/e","./templates/live.html")
r.Run(":80")
}
3.7.3 重定向
package main
import (
"github.com/gin-gonic/gin"
)
func redirect_abroad(c *gin.Context) {
//支持外部的重定向
c.Redirect(301, "http://www.baidu.com/")
}
func redirect_within(c *gin.Context) {
//支持内部的重定向
c.Redirect(301, "/home")
}
func index(c *gin.Context) {
c.String(200, "hello world")
}
func home(c *gin.Context) {
c.String(200, "hello home")
}
func main() {
r := gin.Default()
r.GET("/abroad", redirect_abroad)
r.GET("/within", redirect_within)
r.GET("/index", index)
r.GET("/home", home)
r.Run(":80")
}
3.7.4 全局中间件
package main
import (
"github.com/gin-gonic/gin"
)
func index(c *gin.Context) {
c.String(200, "日你大爷的")
}
//中间件的定义
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
password := c.Query("password")
if name == "admin" && password == "111111" {
c.String(200, "验证通过</br>")
//请求前
//前置操作
c.Next() //处理请求(只能在中间件中使用)
//请求后
//后置操作
c.String(200, "中间件过了</br>")
} else {
//数据挂起,打断
c.Abort()
c.String(200, "我是中间件,你没有权限")
}
}
}
func main() {
r := gin.Default()
//设置全局中间件
r.Use(Logger())
r.GET("/index", index)
r.Run(":80")
}
3.7.5 分组中间件
package main
import (
"github.com/gin-gonic/gin"
)
//中间件的定义
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
password := c.Query("password")
if name == "admin" && password == "111111" {
c.String(200, "验证通过</br>")
//请求前
//前置操作
} else {
//数据挂起,打断
c.Abort()
c.String(200, "我是中间件,你没有权限")
}
}
}
func index(c *gin.Context) {
c.String(200, "日你大爷的")
}
func home(c *gin.Context) {
c.String(200, "hello home")
}
func login(c *gin.Context) {
c.String(200, "请先登陆!")
}
func main() {
r := gin.Default()
//设置分组中间件
s := r.Group("/index", Logger())
{
s.GET("/index", index)
s.GET("/home", home)
}
r.GET("/login", login)
r.Run(":80")
}
3.7.6 设置群组
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func get1(c *gin.Context) {
c.String(http.StatusOK, "Hello get1")
}
func get2(c *gin.Context) {
c.String(http.StatusOK, "Hello get2")
}
func main() {
r := gin.Default()
//设置分组
s := r.Group("/getinfo")
{
s.GET("/get1", get1)
s.GET("/get2", get2)
}
//默认监听8080
r.Run(":80")
}