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

package main

import (
"github.com/gin-gonic/gin"
) func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(, gin.H{
"message": "pong",
})
})
r.Run() //listen and serve on 0.0.0.0:8080
}

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

2: gin的基本路由

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

3、获取路由的参数

3.1 Parameters in path
编写param1.go文件

package main

import (
"github.com/gin-gonic/gin"
"net/http"
) func main() {
r := gin.Default() //这个能匹配 /user/tom , 但是不能匹配 /user/ 或 /user
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK, "Hello %s", name)
}) //有一个方法可以匹配 /user/tom, 也可以匹配 /user/tom/send
//如果没有任何了路由匹配 /user/tom, 它将会跳转到 /user/tom/
r.GET("/user/:name/*action", func(c *gin.Context) {
name := c.Param("name")
action := c.Param("action")
message := name + " is " + action
c.String(http.StatusOK, message)
}) r.Run(":8080")
}

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

package main

//Querystring parameters

import (
"github.com/gin-gonic/gin"
"net/http"
) func main() {
r := gin.Default()
r.GET("/welcome", func(c *gin.Context) {
firstname := c.DefaultQuery("firstname", "Guest") //如果没有值,还可以给一个默认值
lastname := c.Query("lastname")
c.String(http.StatusOK, "Hello %s %s ", firstname, lastname)
})
r.Run(":8080")
}

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

package main

import (
"github.com/gin-gonic/gin"
// "net/http"
) func main() {
r := gin.Default()
r.POST("/form_post", func(c *gin.Context) {
message := c.PostForm("message")
nick := c.DefaultPostForm("nick", "guest") c.JSON(, gin.H{
"status": "posted",
"message": message,
"nick": nick,
})
}) r.Run(":8080")
}

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

3.4 混合型的query + post form

package main

import (
// "fmt"
"github.com/gin-gonic/gin"
) /*
POST /post?id=1234&page=1 HTTP/1.1
Content-Type: application/x-www-form-urlencoded name=manu&message=this_is_great
*/
func main() {
r := gin.Default()
r.POST("/post", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "")
name := c.PostForm("name")
message := c.PostForm("message") // fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message)
c.JSON(, gin.H{
"id": id,
"page": page,
"name": name,
"message": message,
})
}) r.Run(":8080")
}

用postman测试结果如下:

4:解析数据绑定

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

package main

import (
"github.com/gin-gonic/gin"
"net/http"
) // Binding from JSON
type User struct {
Username string `form:"username" json:"username" binding:"required"`
Password string `form:"password" json:"password" binding:"required"`
Age int `form:"age" json:"age"`
} func main() {
r := gin.Default()
// Example for binding JSON ({"username": "manu", "password": "123"})
r.POST("/loginJSON", func(c *gin.Context) {
var json User if err := c.ShouldBindJSON(&json); err == nil {
if json.Username == "manu" && json.Password == "" {
c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized", "username": json.Username, "pass": json.Password})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
// Example for binding a HTML form (user=manu&password=123)
r.POST("/loginForm", func(c *gin.Context) {
var form User
if err := c.ShouldBind(&form); err != nil {
if form.Username == "manu" && form.Password == "" {
c.JSON(http.StatusOK, gin.H{"status": "you are logged in 2"})
} else {
c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized 2"})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
}
})
r.Run(":8080")
}

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

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. windows电脑上安装虚拟机

    1.搭建虚拟机环境 1)先安装VMware10,在本机上双击VMware10.exe,安装过程要用密钥,双击VM10KeyGen.exe会生成密钥,输入就可以了 2)在VMware中新建虚拟机,加载系 ...

  2. windows调试之命令行窗口问题

    CProProcess::InitProProcess(_T("safeProcessDemo")); cout << "Enter 'q' to exit: ...

  3. 第三次java测验2

    package java3; public class Suiji { public long a=12345L;//定义long类型的a,b,c变量 public long c=12345L; pu ...

  4. nginx-轮询、权重、ip_hash 、fair模式

    在 linux 下有 Nginx.LVS.Haproxy 等等服务可以提供负载均衡服 务,而且 Nginx 提供了几种分配方式(策略): 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器 ...

  5. 第06课:GDB 常用命令详解(下)

    本课的核心内容: disassemble 命令 set args 和 show args 命令 tbreak 命令 watch 命令 display 命令 6.1 disassemble 命令 当进行 ...

  6. 关于Mongodb的其他知识

    Mongodb支持的数据类型 数据类型 描述 String 字符串.存储数据常用的数据类型.在 MongoDB 中,UTF-8 编码的字符串才是合法的. Integer 整型数值.用于存储数值.根据你 ...

  7. ES修改最大分页数

    curl -XPUT http://localhost:9200/my_index/_settings?preserve_existing=true -H 'Content-Type: applica ...

  8. chomd添加权限

    chmod 777 -R * 的意思是把当前目录所有文件(递归的)的属性全部为7

  9. 深浅拷贝(copy)

    目录 copy 模块 1.拷贝(赋值) 1). x为不可变数据类型 2). x为可变数据类型 3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表) 2.浅拷贝 3.深拷 ...

  10. JS中生成随机数

    1.Math 对象方法: Math.ceil(); //向上取整. Math.floor(); //向下取整. Math.round(); //四舍五入. Math.random(); //0.0 ~ ...