数据格式响应
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
// 定义接收数据的结构体
type Login struct {
//binding ,required修饰字段,若接收为空值,则报错,是必须字段
User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"`
Pssword string `form:"password" json:"password" uri:"password" xml:"password" binding:"required"`
}
func main() {
//创建路由
//默认使用了两个中间件logger(),Recovery()
r := gin.Default()
//JSON绑定
r.POST("loginJSON", func(ctx *gin.Context) {
//申明接收的变量
var json Login
//将request的body中的数据,自动按照json格式解析到结构体
if err := ctx.ShouldBindJSON(&json); err != nil {
//返回错误信息
//gin.H封装了生成json的工具
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
//判断用户名密码是否正确
if json.User != "root" || json.Pssword != "admin" {
ctx.JSON(http.StatusBadRequest, gin.H{"status": "304"})
return
}
ctx.JSON(http.StatusOK, gin.H{"status": "200"})
})
r.Run()
}
HTML模板渲染
- gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换
- LoadHTMLGlob()方法可以加载模板文件
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
//gin支持加载HTML模板, 然后根据模板参数进行配置并返回相应的数据,本质上就是字符串替换
//LoadHTMLGlob()方法可以加载模板文件
func main() {
r := gin.Default()
r.LoadHTMLGlob("tem/*")
r.GET("/index", func(ctx *gin.Context) {
ctx.HTML(http.StatusOK, "index.html", gin.H{
"tiltle": "我是测试",
"ce": "1223456",
})
})
r.Run()
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>{{.tiltle}}</title>
</head>
<body>
helloworld{{.ce}}
</body>
</html>
重定向
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/index", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, "http://www.5lmh.com")
})
r.Run()
}
异步同步
package main
import (
"log"
"time"
"github.com/gin-gonic/gin"
)
//goroutine机制可以方便地实现异步处理
//另外,在启动新的goroutine时,不应该使用原始上下文,必须使用它的只读副本
func main() {
r := gin.Default()
//异步
r.GET("/long_async", func(ctx *gin.Context) {
//需要搞一个副本
copyContext := ctx.Copy()
//异步处理
go func() {
time.Sleep(3 * time.Second)
log.Println("异步执行:" + copyContext.Request.URL.Path)
}()
})
//同步
r.GET("/long_sync", func(ctx *gin.Context) {
time.Sleep(3 * time.Second)
log.Println("同步执行" + ctx.Request.URL.Path)
})
r.Run()
}