什么是GIn框架?
首先是安装Gin,第一次安装有个问题,就是超时啥的,解决:
file->settings->Go Moudles 加入GOPROXY=“https://goproxy.io”;GO111MOUDLE=“on”
或者GOPROXY=“https://goproxy.io”;,总之就是个代理,为了你下载github上的框架(本质还是库(包))不超时,简单说就是为了下载成功!
就成功了
本文很多都是我自己第一次学习(官网部分例子(我认为重要的写了))理解着来的,如果你是大佬请不要浪费时间
结束进程方法:在终端ctrl+c 了解推荐:优雅
如果你对每次都要设置默认语言很难受,可以看看这个:设置typora默认语言
go mod tidy
or
go get -u github.com/gin-gonic/gin
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就可以了
就很扯淡,第一次看到例子,就一行解释(往后可能连解释都没)
总之,如你所见就是把中文字符转化为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")
}
这个我对官网例子稍微改了一下(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>
到了这以后就要注意是不是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"
}
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,所以前边必须一样
多文件就是循环遍历就不写了
四种请求方式,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!",
})
})