gin快速入门

什么是GIn框架?

安装配置

安装Gin

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

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

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

就成功了

gin快速入门_第1张图片

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

结束进程方法:在终端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":  "
"
, } // 输出 : {"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

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
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


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

你可能感兴趣的:(go,golang,开发语言,后端)