gin快速入门

本文介绍了Gin框架的基础安装配置,包括设置GOPROXY、使用示例代码实现GET、POST、HTML渲染、Multipart/Urlencoded表单、重定向、RESTful API开发以及中间件的使用。通过实例演示了如何创建一个响应丰富的Web应用。
摘要由CSDN通过智能技术生成

什么是GIn框架?

安装配置
安装Gin

首先是安装Gin,第一次安装有个问题,就是超时啥的,解决:

file->settings->Go Moudles 加入GOPROXY=“https://goproxy.io”;GO111MOUDLE=“on”

或者GOPROXY=“https://goproxy.io”;,总之就是个代理,为了你下载github上的框架(本质还是库(包))不超时,简单说就是为了下载成功!

就成功了

本文很多都是我自己第一次学习(官网部分例子(我认为重要的写了))理解着来的,如果你是大佬请不要浪费时间

结束进程方法:在终端ctrl+c 了解推荐:优雅

如果你对每次都要设置默认语言很难受,可以看看这个:设置typora默认语言

练手
  1. go mod tidy

    • or

      go get -u github.com/gin-gonic/gin
      
  2. package main
    
    import "github.com/gin-gonic/gin"
    
    func main() {
    	r := gin.Default()
    	r.GET("/ping", func(c *gin.Context) {
    		c.JSON(200, gin.H{   //200 可以替换为http.StatusOK
    			"message": "我是大帅哥,hello gin",
    		})
    	})
    	r.Run() // 默认8080端口
    }
    

    打开127.0.0.1:8080/ping就可以了

gin官方入门
AsciiJSON

就很扯淡,第一次看到例子,就一行解释(往后可能连解释都没)

总之,如你所见就是把中文字符转化为unicode码?

func main() {
	r := gin.Default()

	r.GET("/someJSON", func(c *gin.Context) {
		data := map[string]interface{}{
			"lang": "GO语言",
			"tag":  "<br>",
		}

		// 输出 : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"}
		c.AsciiJSON(http.StatusOK, data)
	})

	// 监听并在 0.0.0.0:8080 上启动服务
	r.Run(":8080")
}

HTML渲染

这个我对官网例子稍微改了一下(get的请求方式可以直接通过浏览器打开网址就行)

func main() {
	r := gin.Default()
	r.LoadHTMLGlob("templates/*")
	r.GET("/index", func(c *gin.Context) { //8080/index
		c.HTML(http.StatusOK, "index.html", gin.H{
			"name": "编程大神",
			"love": "追寻美,创造美",
		})
	})
	r.Run() //默认端口号8080
}
//同级目录写个templates目录下写个index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>
        myName is: {{.name}}
    </h1>
    <h1>
        myLove is:{{.love}}
    </h1>
</body>
</html>
Multipart/Urlencoded 表单

到了这以后就要注意是不是post 的请求了,我们需要到官网下载一个postman,方便我们查看,其实没啥好看的终端也会显示(只要出来200,并且打印出来就是对了,如果404就错了,到这一步就不需要去浏览器了,因为没有表单,只能报错),不过总算是更加可视化了一些,下载地址:https://www.postman.com/downloads/

(每写一次都要吐槽一次,这种.exe的下载方式老是自己下载到c盘还要进那啥,根本不给人个选择,算了删除到也不麻烦)(当然有些.exe支持自定义下载地方)

上代码

func main() {
	r := gin.Default()
	r.POST("/form_post", func(c *gin.Context) {
		message := c.PostForm("message")              //没有初始值
		nick := c.DefaultPostForm("nick", "anoymous") //有初始值

		c.JSON(200, gin.H{
			//先进后出
			"status":  "posted",
			"message": message,
			"nick":    nick,
		})
	})
	r.Run()
}
//结果是这样的
{
    "message": "",
    "nick": "anoymous",
    "status": "posted"
}
Query和post form

DefaultQuery获取默认参数。也可以获取链接写的参数到page

Query可以获取链接写的参数到id

name和message需要传参

func main() {
	r := gin.Default()
	r.POST("/post", func(c *gin.Context) {
        //获取Query参数和Form参数
		id := c.Query("id")
		page := c.DefaultQuery("page", "0")
		name := c.PostForm("name")
		message := c.PostForm("message")

		fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)

	})
	r.Run()
}

成功的样子:

http://localhost:8080/post?id=1234&page=1

http://localhost:8080/post?id=1234&page=1&name=manu&message=this_is_great

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3bx0IW60-1651760017826)(D:\Program Files\笔记\lifenote\学习阶段笔记\Go进阶\Gin框架.assets\image-20220505112159807-16517209220061.png)]

文件下载

curl用于文件下载和上传,支持部分下载,例如只下载图片或者form表单,用法简单例如:curl ``“www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”

单文件,以下两个文件在同一个目录

index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>上传文件示例</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="f1">
    <input type="submit" value="submit">
</form>
</body>
</html>

.go

func main() {
	r := gin.Default()
	r.LoadHTMLFiles("./index.html")
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})
	r.POST("/upload", func(c *gin.Context) {
		// 单个文件
		f, err := c.FormFile("f1")
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"error": err.Error(),
			})
		} else {
			//dst := fmt.Sprintf("./%s", f.Filename)
			dst := path.Join("./", f.Filename)
			c.SaveUploadedFile(f, dst)
			c.JSON(http.StatusOK, gin.H{
				"status": "Ok",
			})
		}
	})
	r.Run()
}

一定注意通过端口号 127.0.0.1:8080/index 这个打开html不然会失败,因为怎么从index到8080下的upload,所以前边必须一样

多文件就是循环遍历就不写了

转向李文周
RESTful API的开发

四种请求方式,postman对应请求方式显示对应内容

func main() {
	r := gin.Default()
	r.GET("/book", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "GET",
		})
	})

	r.POST("/book", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "POST",
		})
	})

	r.PUT("/book", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "PUT",
		})
	})

	r.DELETE("/book", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "DELETE",
		})
	})
}
重定向

http重定向

r.GET("/test", func(c *gin.Context) {
	c.Redirect(http.StatusMovedPermanently, "http://www.sogo.com/")
})

路由重定向

r.GET("/test", func(c *gin.Context) {
    // 指定重定向的URL
    c.Request.URL.Path = "/test2"
    r.HandleContext(c)
})
r.GET("/test2", func(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{"hello": "world"})
})
中间件

这个之后应该很实用(盲猜)

中间件就是为了你的方便,简单说这不是一个死的组件,有弹性的

func StatCost() gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		c.Set("name", "小王子") //全局变量
		// 调用该请求的剩余处理程序
		c.Next()//通过计时函数算出下个中间件运行时间
		cost := time.Since(start)
		log.Println(cost)
	}
}
func main() {
	r := gin.New()
	// 全局中间件,但凡get请求必须调用这个全局中间件,再调用后边的中间件
	r.Use(StatCost())
	
	r.GET("/test", func(c *gin.Context) {
		name := c.MustGet("name").(string) // 拿到name
		log.Println(name)
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello world!",
		})
	})
	r.Run()
}
// 中间件可以注册多个,请求也可以有多个,但是路由变了
	r.GET("/test2", StatCost(), func(c *gin.Context) {
		name := c.MustGet("name").(string) // 拿到name
		log.Println(name)
		c.JSON(http.StatusOK, gin.H{
			"message": "Hello world!",
		})
	})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不之道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值