经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Gin框架介绍与使用
来源:cnblogs  作者:听风走了八千里  时间:2021/5/24 11:47:36  对本文有异议

Gin

  1. // 初识 Gin框架
  2. //下载(可能会下载不全。缺什么get什么即可)
  3. //go get -u -v github.com/gin-gonic/gin
  4. package main
  5. import (
  6. "github.com/gin-gonic/gin"
  7. "log"
  8. "net/http"
  9. )
  10. func main() {
  11. r := gin.Default()
  12. r.GET("/", func(c *gin.Context) {
  13. c.JSON(http.StatusOK, map[string]string{"name": "zjhah"})
  14. })
  15. err := r.Run()
  16. log.Fatalln(err)
  17. //
  18. }

Gin框架的热加载 realize

  1. // 下载
  2. go get github.com/oxequa/realize
  3. // 下载之后
  4. realize init 初始化 直接下步一步退出即可
  5. realize start 就是直接将gin运行起来 进行热加载
  • Gin框架—log (Gin 框架 - 使用 logrus 进行日志记录)

约定日志格式字段:

请求时间, 日志级别, 状态码, 执行时间, 请求IP, 请求方式,请求路由

Logrus

API的URL设计规则restful api

1. api有版本信息

/v1/xxxx

/v2/xxx

2.尽可能的使用复数, 含义明确 名词最好

/v1/users

/v1/topics

3.使用GET参数规划数据展现规则

/v1/users

/v1/users?limit=10 //只显示10条

  • 路由组
  1. router := gin.Default()
  2. r := router.Group("/v1/") // group组
  3. r.GET("/", FirstJson)
  4. r.POST("/", PostTest)
  5. _ = router.Run(":9000")
  • api参数
  1. // 这是api参数
  2. r.GET("/:name", FirstJson)
  3. c.param("name")
  • URL参数
  1. ?key=xxx & name=xxx
  • 表单取文件
  1. r.Post("/v1/:file")
  2. file := c.Formfile("file")
  3. _ := c.saveUploadFile(file, file.FileName)
  • 表单上传多个文件
  1. // 设置上传的文件的最大容量
  2. r.MaxMultipartMemory = 8*1024
  3. // 获取多个文件
  4. form, _ := c.MultipartForm()
  5. files := form.File["file"]
  6. 然后循环像上边单个存一样
  • 接收数据的结构体
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. _ "github.com/sirupsen/logrus"
  6. _ "log"
  7. "net/http"
  8. )
  9. // 接收数据的结构体
  10. type Option struct {
  11. User string `form:"username" json:"username" uri:"user" xml:"user" binding:"required"` // binding必须不能为空
  12. Password string `form:"password" json:"password" xml:"password" uri:"password"`
  13. }
  14. func main() {
  15. // 创建路由
  16. // default 创建的路由默认使用了两个中间件 logger()日志 recovery() 自动恢复
  17. router := gin.Default()
  18. // 原生的是这个 是不会使用这两个中间件的
  19. // router := gin.New()
  20. router.Use(gin.Logger())
  21. r := router.Group("/v1")
  22. {
  23. r.POST("/JsonTest", JsonTest)
  24. }
  25. _ = router.Run(":9000")
  26. //
  27. }
  28. func JsonTest(c *gin.Context) {
  29. // Bind() 默认解析并绑定form格式
  30. // 根据请求头中的 content-type 判断数据类型
  31. var Form Option
  32. errs := c.Bind(&Form)
  33. if errs != nil {
  34. c.JSON(http.StatusBadRequest, gin.H{"error": errs.Error()})
  35. }
  36. fmt.Println(Form)
  37. // 声明接收的变量 json绑定
  38. var jsonData Option
  39. // 接收到的数据 绑定到jsonData结构体 ShouldBindJSON
  40. err := c.ShouldBindJSON(&jsonData)
  41. fmt.Println(jsonData)
  42. if err != nil {
  43. // gin.H 封装了生成json数据的工具
  44. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  45. return
  46. }
  47. if jsonData.User != "root" || jsonData.Password != "123" {
  48. c.JSON(http.StatusBadRequest, gin.H{"status_code": "302"})
  49. return
  50. }
  51. c.JSON(http.StatusOK, gin.H{"status": 200})
  52. }
  • HTML模版渲染 类似于python render
  1. // 加载模版文件
  2. // router.LoadHTMLFiles("templates/index.html")
  3. router.LoadHTMLGlob("templates/*")
  4. // 返回状态码。返回html渲染文件。返回想要在html文件中所需要的数据
  5. c.HTML("200", "index.html", gin.H{"title": "ccn"})
  • 重定向
  1. r.GET("/redirect", Redirects)
  2. func Redirects(c *gin.Context) {
  3. c.Redirect(http.StatusMovedPermanently, "http://www.taobao.com/")
  4. }
  • 同步异步
  1. // 异步
  2. func Async(c *gin.Context) {
  3. // go routine 机制可以方便的实现异步处理
  4. // 注意: 在启动新的goroutine时, 不应该使用原始上下文, 必须使用他的只读副本
  5. copyContent := c.Copy()
  6. // go func 处理的就是要处理的数据之类的 例如上传文件, 修改数据, 添加数据
  7. go func() {
  8. time.Sleep(5 * time.Second)
  9. fmt.Println(copyContent.Request.Method, copyContent.Request.Header, copyContent.Request.RemoteAddr, copyContent.Request.RequestURI)
  10. }()
  11. c.JSON(http.StatusOK, gin.H{"name": 123})
  12. }
  13. // 正常的都是同步
  • gin中间件
  1. //gin可以构建中间件, 但它只对注册过的路由函数起作用
  2. //对于分组路由, 嵌套使用中间件, 可以限定中间件的作用范围
  3. //中间件分为全局中间件, 单个路由中间件和群组中间件
  4. //gin中间件必须是一个gin.HandlerFun类型
  5. // 全局中间件所有的中间件都会经过
  6. func GinMiddleWare() gin.HandlerFunc {
  7. return func(c *gin.Context) {
  8. fmt.Println("中间件开始执行")
  9. // 设置变量到context的key中, 后边可以通过Get()获取
  10. c.Set("request", "中间件")
  11. // 执行router绑定的函数
  12. c.Next()
  13. // 执行完中间件后执行的代码
  14. status := c.Writer.Status()
  15. fmt.Println(status)
  16. }
  17. }
  18. c.GET("request")
  • gin生成接口文档 swagger
  • JSON web token JWT
  • 令牌桶 漏桶

原文链接:http://www.cnblogs.com/zjaiccn/p/14803503.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号