下载并安装Gin
go get github.com/gin-gonic/gin
Gin如何实现http的get方法
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/get", getMsg)
r.Run(":9090")
}
func getMsg(c *gin.Context) {
name := c.Query("name")
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"msg": "成功" + name,
})
}
Gin如何实现http的post方法
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.POST("/post", postMsg)
r.Run(":9090")
}
func postMsg(c *gin.Context) {
name := c.DefaultPostForm("name", "")
fmt.Println(name)
form, b := c.GetPostForm("name")
fmt.Println(form, b)
c.JSON(http.StatusOK, "欢迎你"+name)
}
Gin如何实现重定向
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/redirect1", func(c *gin.Context) {
url := "https://www.baidu.com"
c.Redirect(http.StatusMovedPermanently, url)
})
r.GET("/redirect2", func(c *gin.Context) {
c.Request.URL.Path = "/redirect3"
r.HandleContext(c)
})
r.GET("/redirect3", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"msg": "响应成功",
})
})
r.Run(":9090")
}
Gin如何获取第三方数据
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/getOtherData", func(c *gin.Context) {
url := "http://www.baidu.com"
resp, err := http.Get(url)
if err != nil || resp.StatusCode != http.StatusOK {
c.Status(http.StatusServiceUnavailable)
return
}
body := resp.Body
contentLength := resp.ContentLength
contentType := resp.Header.Get("Content-Type")
c.DataFromReader(http.StatusOK, contentLength, contentType, body, nil)
})
r.Run(":9090")
}
Gin如何多形式渲染
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/json", func(c *gin.Context) {
c.JSON(200, gin.H{
"html": "<b>hello,Gin框架</b>",
})
})
r.GET("/someHTML", func(c *gin.Context) {
c.PureJSON(http.StatusOK, gin.H{
"html": "<b>hello,Gin框架</b>",
})
})
r.GET("/someXML", func(c *gin.Context) {
type Message struct {
Name string
Msg string
Age int
}
info:=Message{}
info.Name="阿晓"
info.Msg="hello"
info.Age=23
info.Msg = "hello"
c.XML(http.StatusOK, info)
})
r.GET("/someYAML", func(c *gin.Context) {
c.YAML(http.StatusOK, gin.H{
"message": "Gin框架的多形式渲染",
"status": 200,
})
})
r.Run(":9090")
}
Gin文件服务器
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/file", fileServer)
r.Run(":9090")
}
func fileServer(c *gin.Context) {
path := "E:/GoSrc/src/"
fileName := path + c.Query("name")
c.File(fileName)
}
Gin 单文件上传
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r:=gin.Default()
r.POST("/upload", func(c *gin.Context) {
file, err := c.FormFile("fileName")
if err!=nil {
c.String(http.StatusBadRequest,"文件上传错误!")
}
dst:="E:/GoSrc/src/"
c.SaveUploadedFile(file,dst+file.Filename)
c.String(http.StatusOK,fmt.Sprintf("%s 上传完成",file.Filename))
})
r.Run(":9090")
}
Gin 多文件上传
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r:=gin.Default()
r.POST("/upload", func(c *gin.Context) {
form, err := c.MultipartForm()
if err!=nil {
c.String(http.StatusBadRequest,"上传文件错误")
}
files := form.File["file_key"]
dst:="E:/GoSrc/src/"
for _,file:=range files{
c.SaveUploadedFile(file,dst+file.Filename)
}
c.String(http.StatusOK,fmt.Sprintf("%d 个文件上传完成!", len(files)))
})
r.Run(":9090")
}
Gin 如何自定义中间件
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
"strconv"
)
func main() {
r:=gin.Default()
r.Use(Middleware())
r.GET("/middleware", func(c *gin.Context) {
fmt.Println("服务端执行开始执行....")
name:=c.Query("name")
ageStr:=c.Query("age")
age,_:=strconv.Atoi(ageStr)
log.Println(name,age)
res:= struct {
Name string `json:"name"`
Age int `json:"age"`
}{name,age}
c.JSON(http.StatusOK,res)
})
r.Run(":9090")
}
func Middleware() gin.HandlerFunc {
return func(c *gin.Context) {
fmt.Println("中间件开始执行=====")
name:=c.Query("name")
ageStr:=c.Query("age")
age, err := strconv.Atoi(ageStr)
if err!=nil {
c.AbortWithStatusJSON(http.StatusBadRequest,"输入的数据错误,年龄不是整数")
return
}
if age<0||age>100 {
c.AbortWithStatusJSON(http.StatusBadRequest,"输入的数据错误,年龄数据错误")
return
}
if len(name)<6|| len(name)>12 {
c.AbortWithStatusJSON(http.StatusBadRequest,"用户名只能是6-12位")
return
}
c.Next()
fmt.Println(name,age)
}
}
Gin 登录中间件
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.Use(AuthMiddleware())
r.GET("/login", func(c *gin.Context) {
user := c.MustGet(gin.AuthUserKey).(string)
c.JSON(http.StatusBadRequest, "登录成功,欢迎您:"+user)
})
r.Run(":9090")
}
func AuthMiddleware() gin.HandlerFunc {
accounts := gin.Accounts{
"admin": "adminpw",
"system": "systempw",
}
accounts["Go"]="123456789"
accounts["Gin"]="gin123"
auth := gin.BasicAuth(accounts)
return auth
}
Gin 同步异步
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"strconv"
"time"
)
func main() {
r:=gin.Default()
r.GET("/sync", func(c *gin.Context) {
sync(c)
c.JSON(200,">>>主程序(主go程)同步已经执行<<<")
})
r.GET("/async", func(c *gin.Context) {
for i:=0;i<6;i++{
cCp:=c.Copy()
go async(cCp,i)
}
c.JSON(200,"^^^主程序(主go程)异步已经执行^^^")
})
r.Run(":9090")
}
func async(cp *gin.Context, i int) {
fmt.Println("第"+strconv.Itoa(i)+"个go程开始执行:"+cp.Request.URL.Path)
time.Sleep(time.Second*3)
fmt.Println("第"+strconv.Itoa(i)+"个go程执行结束+++++")
}
func sync(c *gin.Context) {
println("开始执行同步任务:"+c.Request.URL.Path)
time.Sleep(time.Second*3)
println("同步任务执行完成!")
}