golang中gin框架的基础学习和运用

 

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")
}

             

猜你喜欢

转载自blog.csdn.net/feiwutudou/article/details/81188146