目录
1.安装
2.基本的架构
2.1 直接调用方案
2.2 函数方案
3.HTTP服务器
3.1 GET参数获取
3.2 POST参数获取
3.3 JSON参数获取
3.4 提交表单获取参数
3.5 文件上传
3.6 响应输出
3.7 嵌套HTML视图
3.7.1 HTML简单输出
live.html
3.7.2 文件的路由定义
3.7.3 重定向
3.7.4 全局中间件
3.7.5 分组中间件
3.7.6 设置群组
go get gopkg.in/gin-gonic/gin.v1
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
name := c.Query("name")
c.String(http.StatusOK, "Hello %s", name)
})
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func pings(c *gin.Context) {
name := c.Query("name")
c.String(http.StatusOK, "Hello %s", name)
}
func main() {
r := gin.Default()
r.GET("/ping", pings)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func getinfos(c *gin.Context) {
//获取name
name := c.Query("name")
//DefaultQuery 第一个是获取值 第二个参数是默认值
lastname := c.DefaultQuery("lastname", "这是默认值")
c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
func main() {
r := gin.Default()
r.GET("/ping", getinfos)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func postinfos(c *gin.Context) {
//获取name
name := c.PostForm("name")
//DefaultPostForm 第一个是获取值 第二个参数是默认值
lastname := c.DefaultPostForm("lastname", "这是默认值")
c.String(http.StatusOK, "Hello %s,%s", name, lastname)
}
func main() {
r := gin.Default()
r.POST("/postinfos", postinfos)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type Login struct {
Name string `json:"name"`
Password string `json:"password"`
}
func loginJSON(c *gin.Context) {
json := Login{}
//获取json数据后并解析
if c.BindJSON(&json) == nil {
if json.Name == "root" && json.Password == "root" {
c.JSON(http.StatusOK, gin.H{"status": "登陆成功"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "账号或者密码错误"})
}
}
}
func main() {
r := gin.Default()
// 绑定JSON的例子 ({"name": "manu", "password": "123"})
r.POST("/loginJSON", loginJSON)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
type Login struct {
Name string `form:"name"`
Password string `form:"password"`
}
func loginFORM(c *gin.Context) {
form := Login{}
//获取form数据后并解析
if c.Bind(&form) == nil {
if form.Name == "root" && form.Password == "root" {
c.JSON(200, gin.H{"status": "登陆成功"})
} else {
c.JSON(203, gin.H{"status": "账号或者密码错误"})
}
}
}
func main() {
r := gin.Default()
r.POST("/loginFORM", loginFORM)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"os"
"log"
"io"
"time"
"strconv"
)
//上传文件
func file(c *gin.Context) {
//上传文件名称
file, header, err := c.Request.FormFile("upload")
if err != nil {
c.JSON(200, gin.H{"msg": "文件不得为空"})
return
}
filename := time.Now().Unix()
//创建文件
out, err := os.Create("./public/"+strconv.FormatInt(filename, 10) + ".png")
if err != nil {
log.Fatal(err)
}
defer out.Close()
//复制流文件
_, err = io.Copy(out, file)
if err != nil {
log.Fatal(err)
}
c.JSON(200, gin.H{"msg": "文件" + header.Filename + "已经上传完成,新名字为:" + strconv.FormatInt(filename, 10)})
}
func main() {
r := gin.Default()
r.POST("/file", file)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
type msg struct {
Name string
Message string
Number int
}
func moreJSON(c *gin.Context) {
msg := msg{}
msg.Name = "Lena"
msg.Message = "hey"
msg.Number = 123
// 以下方式都会输出 : {"name": "Lena", "Message": "hey", "Number": 123}
c.JSON(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
c.XML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
c.YAML(200, gin.H{"Name": "Lena", "Message": "hey", "Number": 123})
//输出的结构体
c.JSON(200, msg)
c.XML(200, msg)
c.YAML(200, msg)
}
func main() {
r := gin.Default()
r.GET("/moreJSON", moreJSON)
//默认监听8080
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
func index(c *gin.Context) {
//根据完整文件名渲染模板,并传递参数
c.HTML(200, "live.html", gin.H{
"title": "你就是个二大傻子",
})
}
func main() {
r := gin.Default()
//加载模板
r.LoadHTMLGlob("templates/*")
//定义路由
r.GET("/index", index)
r.Run(":80")
}
live
11111111111111111
{{.title}}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
//定义多文件的路径,使用的是系统的路径(绝对,相对地址都可以)
r.Static("/a", "D:/phpStudy/WWW/go/templates")
r.Static("/b", "./templates")
r.StaticFS("/c",http.Dir("./templates"))
r.StaticFS("/d",http.Dir("D:/phpStudy/WWW/go/templates"))
//定义单个文件的路径,使用的是绝对路径
r.StaticFile("/e","./templates/live.html")
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
func redirect_abroad(c *gin.Context) {
//支持外部的重定向
c.Redirect(301, "http://www.baidu.com/")
}
func redirect_within(c *gin.Context) {
//支持内部的重定向
c.Redirect(301, "/home")
}
func index(c *gin.Context) {
c.String(200, "hello world")
}
func home(c *gin.Context) {
c.String(200, "hello home")
}
func main() {
r := gin.Default()
r.GET("/abroad", redirect_abroad)
r.GET("/within", redirect_within)
r.GET("/index", index)
r.GET("/home", home)
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
func index(c *gin.Context) {
c.String(200, "日你大爷的")
}
//中间件的定义
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
password := c.Query("password")
if name == "admin" && password == "111111" {
c.String(200, "验证通过")
//请求前
//前置操作
c.Next() //处理请求(只能在中间件中使用)
//请求后
//后置操作
c.String(200, "中间件过了")
} else {
//数据挂起,打断
c.Abort()
c.String(200, "我是中间件,你没有权限")
}
}
}
func main() {
r := gin.Default()
//设置全局中间件
r.Use(Logger())
r.GET("/index", index)
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
)
//中间件的定义
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
password := c.Query("password")
if name == "admin" && password == "111111" {
c.String(200, "验证通过")
//请求前
//前置操作
} else {
//数据挂起,打断
c.Abort()
c.String(200, "我是中间件,你没有权限")
}
}
}
func index(c *gin.Context) {
c.String(200, "日你大爷的")
}
func home(c *gin.Context) {
c.String(200, "hello home")
}
func login(c *gin.Context) {
c.String(200, "请先登陆!")
}
func main() {
r := gin.Default()
//设置分组中间件
s := r.Group("/index", Logger())
{
s.GET("/index", index)
s.GET("/home", home)
}
r.GET("/login", login)
r.Run(":80")
}
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func get1(c *gin.Context) {
c.String(http.StatusOK, "Hello get1")
}
func get2(c *gin.Context) {
c.String(http.StatusOK, "Hello get2")
}
func main() {
r := gin.Default()
//设置分组
s := r.Group("/getinfo")
{
s.GET("/get1", get1)
s.GET("/get2", get2)
}
//默认监听8080
r.Run(":80")
}
转载自:https://blog.csdn.net/feiwutudou/article/details/81188146
另外一篇优秀文章:https://www.jianshu.com/p/ebd73ffe31e8