gin框架教程代码地址:

我们在用http的时候一般都会用一些web框架来进行开发,gin就是这样的一个框架,它有哪些特点呢

一:gin特点

1、性能优秀
2、基于官方的net/http的有限封装
3、方便 灵活的中间件
4、数据绑定很强大
5、社区比较活跃
等等

二:gin的安装

安装:
go get github.com/gin-gonic/gin

如果要更新:
go get -u github.com/gin-gonic/gin

三:gin的使用

1、入门的第一个示例

先来写出一个例子:example1.go

  1. package main
  2.  
  3. import (
  4. "github.com/gin-gonic/gin"
  5. )
  6.  
  7. func main() {
  8. r := gin.Default()
  9. r.GET("/ping", func(c *gin.Context) {
  10. c.JSON(, gin.H{
  11. "message": "pong",
  12. })
  13. })
  14. r.Run() //listen and serve on 0.0.0.0:8080
  15. }

a. 然后运行 go run example1.go 之后,
b. 在浏览器上输入:http://localhost:8080/ping
输出结果:
{"message":"pong"}

2: gin的基本路由

  1. // 创建带有默认中间件的路由:
  2. r := gin.Default()
  3. //创建不带中间件的路由:
  4. //r := gin.New()
  5. r.GET("/someGet", getting)
  6. r.POST("/somePost", posting)
  7. r.PUT("/somePut", putting)
  8. r.DELETE("/someDelete", deleting)
  9. r.PATCH("/somePatch", patching)
  10. r.HEAD("/someHead", head)
  11. r.OPTIONS("/someOptions", options)

3、获取路由的参数

3.1 Parameters in path
编写param1.go文件

  1. package main
  2.  
  3. import (
  4. "github.com/gin-gonic/gin"
  5. "net/http"
  6. )
  7.  
  8. func main() {
  9. r := gin.Default()
  10.  
  11. //这个能匹配 /user/tom , 但是不能匹配 /user/ 或 /user
  12. r.GET("/user/:name", func(c *gin.Context) {
  13. name := c.Param("name")
  14. c.String(http.StatusOK, "Hello %s", name)
  15. })
  16.  
  17. //有一个方法可以匹配 /user/tom, 也可以匹配 /user/tom/send
  18. //如果没有任何了路由匹配 /user/tom, 它将会跳转到 /user/tom/
  19. r.GET("/user/:name/*action", func(c *gin.Context) {
  20. name := c.Param("name")
  21. action := c.Param("action")
  22. message := name + " is " + action
  23. c.String(http.StatusOK, message)
  24. })
  25.  
  26. r.Run(":8080")
  27. }

a. 然后运行 go run param1.go 之后,

b. 在浏览器上输入:http://localhost:8080/user/tom
输出结果:Hello tom

c. 在浏览器上输入:http://localhost:8080/user/tom/
输出结果:tom is /

d. 在浏览器上输入:http://localhost:8080/user/tom/pig
输出结构: tom is /pig

3.2 query param
一般匹配这种形式的url /welcome?firstname=Jane&lastname=Doe

  1. package main
  2.  
  3. //Querystring parameters
  4.  
  5. import (
  6. "github.com/gin-gonic/gin"
  7. "net/http"
  8. )
  9.  
  10. func main() {
  11. r := gin.Default()
  12. r.GET("/welcome", func(c *gin.Context) {
  13. firstname := c.DefaultQuery("firstname", "Guest") //如果没有值,还可以给一个默认值
  14. lastname := c.Query("lastname")
  15. c.String(http.StatusOK, "Hello %s %s ", firstname, lastname)
  16. })
  17. r.Run(":8080")
  18. }

a. 然后运行 go run param2.go 之后,
b. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy
输出结果:Hello Guest jimmy

c. 在浏览器上输入:http://localhost:8080/welcome?lastname=jimmy&firstname=tom
输出结果:Hello tom jimmy

3.3 表单参数 Form
Multipart/Urlencoded Form

  1. package main
  2.  
  3. import (
  4. "github.com/gin-gonic/gin"
  5. // "net/http"
  6. )
  7.  
  8. func main() {
  9. r := gin.Default()
  10. r.POST("/form_post", func(c *gin.Context) {
  11. message := c.PostForm("message")
  12. nick := c.DefaultPostForm("nick", "guest")
  13.  
  14. c.JSON(, gin.H{
  15. "status": "posted",
  16. "message": message,
  17. "nick": nick,
  18. })
  19. })
  20.  
  21. r.Run(":8080")
  22. }

可以用postman来测试一下, 测试结果如下:

3.4 混合型的query + post form

  1. package main
  2.  
  3. import (
  4. // "fmt"
  5. "github.com/gin-gonic/gin"
  6. )
  7.  
  8. /*
  9. POST /post?id=1234&page=1 HTTP/1.1
  10. Content-Type: application/x-www-form-urlencoded
  11.  
  12. name=manu&message=this_is_great
  13. */
  14. func main() {
  15. r := gin.Default()
  16. r.POST("/post", func(c *gin.Context) {
  17. id := c.Query("id")
  18. page := c.DefaultQuery("page", "")
  19. name := c.PostForm("name")
  20. message := c.PostForm("message")
  21.  
  22. // fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
  23. c.JSON(, gin.H{
  24. "id": id,
  25. "page": page,
  26. "name": name,
  27. "message": message,
  28. })
  29. })
  30.  
  31. r.Run(":8080")
  32. }

用postman测试结果如下:

4:解析数据绑定

我们可以给一个请求的数据绑定到一个类型,gin支持绑定的类型有JSON,XML和标准的表单数据(foo=bar&boo=baz)。 注意绑定时需要设置绑定类型的标签。比如绑定json数据时,
设置 json:"fieldname"

  1. package main
  2.  
  3. import (
  4. "github.com/gin-gonic/gin"
  5. "net/http"
  6. )
  7.  
  8. // Binding from JSON
  9. type User struct {
  10. Username string `form:"username" json:"username" binding:"required"`
  11. Password string `form:"password" json:"password" binding:"required"`
  12. Age int `form:"age" json:"age"`
  13. }
  14.  
  15. func main() {
  16. r := gin.Default()
  17. // Example for binding JSON ({"username": "manu", "password": "123"})
  18. r.POST("/loginJSON", func(c *gin.Context) {
  19. var json User
  20.  
  21. if err := c.ShouldBindJSON(&json); err == nil {
  22. if json.Username == "manu" && json.Password == "" {
  23. c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
  24. } else {
  25. c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password})
  26. }
  27. } else {
  28. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  29. }
  30. })
  31. // Example for binding a HTML form (user=manu&password=123)
  32. r.POST("/loginForm", func(c *gin.Context) {
  33. var form User
  34. if err := c.ShouldBind(&form); err != nil {
  35. if form.Username == "manu" && form.Password == "" {
  36. c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"})
  37. } else {
  38. c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"})
  39. }
  40. } else {
  41. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  42. }
  43. })
  44. r.Run(":8080")
  45. }

还有一些其他的应用,可以参考:

https://github.com/gin-gonic/gin/blob/master/README.md

gin框架教程一: go框架gin的基本使用的更多相关文章

  1. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  2. revel框架教程之CSRF(跨站请求伪造)保护

    revel框架教程之CSRF(跨站请求伪造)保护 CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山 ...

  3. Kail Linux渗透测试教程之Recon-NG框架

    Kail Linux渗透测试教程之Recon-NG框架 信息收集 信息收集是网络攻击最重要的阶段之一.要想进行渗透攻击,就需要收集目标的各类信息.收集到的信息越多,攻击成功的概率也就越大.本章将介绍信 ...

  4. CRL快速开发框架系列教程一(Code First数据表不需再关心)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. Cobalt Strike使用教程一

    Cobalt Strike使用教程一     0x00 简介 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器.自3.0以后已经不在使用Metasploit框架而作为 ...

  6. gin源码解读2-揭开gin的神秘面纱

    数据如何在gin中流转 func main() { gin.SetMode(gin.DebugMode) // 设置为开发模式 router := gin.Default() _ = router.S ...

  7. [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法

    一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...

  8. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  9. [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法

    本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...

随机推荐

  1. BZOJ 3876 统一下界上下界费用流

    //Mcmf LargeDumpling #include<iostream> #include<cstdio> #include<cstdlib> #includ ...

  2. gson转换问题

    list集合中integer问题 List<Integer> lists= gson.fromJson(params.get("lists"), new TypeTok ...

  3. linux yum的配置文件 repo文件详解

    linux yum的配置文件 repo文件详解 什么是repo文件?repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪 ...

  4. C#写入文件内容时提示:文件正被另一个人或程序使用

    创建文件后未将文件关闭 string sTransLogFile = sTransLogPath + "\\" + DateTime.Now.ToString("yyyy ...

  5. CMD命令行基本命令

    基本知识 输入 功能 Alt+Enter 全屏 Ctrl+S 暂停输出 Ctrl+C Ctrl+Break 停止程序 Ctrl+Z 表示输入结束 <file 从文件读标准输入 >file ...

  6. Java多线程和并发(九),ReentrantLock(公平锁)

    目录 1.ReentrantLock 2.ReentrantLock的实现 3.synchronized和ReentrantLock的区别 九.ReentrantLock(公平锁) 1.Reentra ...

  7. Ueditor 从word中复制内容带多张图片

    粘贴文本 注意,以下配置暂时对 IE 无效.IE 暂时使用系统自带的粘贴功能,没有样式过滤! 关闭粘贴样式的过滤 当从其他网页复制文本内容粘贴到编辑器中,编辑器会默认过滤掉复制文本中自带的样式,目的是 ...

  8. sh_11_字典的其他操作

    sh_11_字典的其他操作 xiaoming_dict = {"name": "小明", "age": 18} # 1. 统计键值对数量 p ...

  9. react-router-dom 实现左侧导航

    1.介绍react-router-dom https://reacttraining.com/react-router/web/example/basic 这个官网有很多栗子可以练手 1.1 Hash ...

  10. Unity3D_(游戏)双人3D坦克_简易版

    双人3D坦克实现 player1: WSAD控制上下左右 空格键发射炮弹 player2: IKJL可控制上下左右 B键发射炮弹 每个坦克只有100hp,子弹击中1次扣30hp,hp时时显示在坦克上 ...