Gin框架简介

Gin是使用Go/Golang语言实现的HTTP Web框架, 接口简洁, 性能极高,截止1.4.0版本,包含测试代码,仅14K, 其中测试代码9K, 也就是说测试源码仅5k左右, 具有类似Martini的API, 性能更高-快40倍.

Gin特性
/*
快速: 路由不使用反射,基于Radix树,内存占用少
中间件: HTTP请求,先经过一系列中间件和最终操作来处理,例如: Logger, Authorization,GZIP等,
这个特性和NodeJs的Koa框架很像, 中间件机制也极大的提高了框架的可扩展性.
Cr
异常处理: 服务始终可用, 不会宕机,Gin可以捕获panic,并恢复,而且极为便利的机制处理HTTP请求过程中发生的错误.
JSON: Gin可以解析并验证请求的JSON, 这个特性对于Restful API的开发尤其有用.
路由分组: 例如需要授权和不需要授权的API分组,不同版本的API分组.
而且分组可嵌套,且性能不受影响.
渲染内置: 原生支持JSON, XML和HTML的渲染.
*/
安装Gin
go get -u -v github.com/gin-gonic/gin

/*
-v:打印出被构建的代码包的名字
-u:已存在相关的代码包,强行更新代码包及其依赖包
*/
第一个Gin程序
package main

import "github.com/gin-gonic/gin"

func main()  {
// 创建一个默认的路由引擎
r := gin.Default() // GET: 请求方式: /hello: 请求的路径
// 当客户端以GET的方法请求/hello路径时,会执行后面的匿名函数
r.GET("/hello", func(c *gin.Context) { // c.JSON: 返回JSON格式的数据
c.JSON(200,gin.H{
"message": "Hello World",
})
}) // 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
} /*
1. 首先我们使用gin.Default()生成了一个实例,这个实例即WSGI应用程序.
2. 接下来, 我们使用r.Get("/",...)声明了一个路由,告诉Gin什么样的URL能触发传入的函数,
这个函数返回我们想要显示在用户浏览器中的信息. 3. 最后用r.Run()函数让应用运行在本地服务器上,默认监听端口是_8080_, 可以传入参数,
例如: r.Run(":9999")即运行在9999端口.
*/

路由

路由方法有GET, POST, PUT, PATCH, DELETEOPTIONS,还有Any,可匹配以上任意类型的请求

无参数
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK,"wunai")
}) /*
curl http://127.0.0.1:8080
wunai
*/
解析路径参数

有时候我们需要动态的路由,如/user/:name, 通过调用不同的url来传入不同的Name, /user/:name/*role, *代表可选

	// 匹配/user/youmen
r.GET("/user/:name", func(c *gin.Context) {
name := c.Param("name")
c.String(http.StatusOK,"Hello %s",name)
}) /*
curl http://127.0.0.1:8080/user/youmen
Hello youmen
*/
获取Query参数
// 匹配users?name=xxx&role=xxx, role可选
r.GET("/users", func(c *gin.Context) {
name := c.Query("name")
role := c.DefaultQuery("role","teacher")
c.String(http.StatusOK,"%s is a %s",name,role)
}) /*
curl http://127.0.0.1:8080/users?name=youmen&role=student
youmen is a student
*/
http常见传输格式
/*
application/json
application/x-www-form-urlencoded
application/xml
multipart/form-data 表单参数可以通过PostForm()方法获取,该方法默认解析的是x-www-form-urlencoded或from-data格式的参数
*/
获取POST参数
// POST
r.POST("/form", func(c *gin.Context) {
username := c.PostForm("username")
password := c.DefaultPostForm("password","123") // 可设置默认值 c.JSON(http.StatusOK,gin.H{
"username":username,
"password":password,
})
}) /*
curl http://localhost:8080/form -X POST -d 'username=youmen&password=1234' {"password":"1234","username":"youmen"}%
*/

Example2

gin_demo1.go

package main

import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
) func main() {
// 创建一个默认的路由引擎
r := gin.Default() // GET: 请求方式: /hello: 请求的路径
// 当客户端以GET的方法请求/hello路径时,会执行后面的匿名函数
r.GET("/hello", func(c *gin.Context) { // c.JSON: 返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello World",
})
}) r.POST("/form", func(c *gin.Context) {
// 表单参数设置默认值
type1 := c.DefaultPostForm("type","alert") // 接受其他的
username := c.PostForm("username")
password := c.PostForm("password") // 多选框
hobbys := c.PostFormArray("hobby")
c.String(http.StatusOK,fmt.Sprintf("type is %s, username is %s, password is %s, habbys is %v",
type1,username,password,hobbys))
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}

register.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <form action="http://127.0.0.1:8080/form" method="post" enctype="application/x-www-form-urlencoded">
用户名: <input type="text" name="username">
密码: <input type="password" name="password"> <input type="checkbox" value="run" name="hobby"> 跑步
<input type="checkbox" value="Weightlifting" name="hobby"> 举重
<input type="checkbox" value="money" name="hobby"> 金钱 <input type="submit" value="注册">
</form> </body>
</html>
Query和POST混合参数
	// GET和POST混合
r.POST("/posts", func(c *gin.Context) {
id := c.Query("id")
page := c.DefaultQuery("page", "0")
username := c.PostForm("username")
password := c.DefaultPostForm("username", "0000") c.JSON(http.StatusOK, gin.H{
"id": id,
"page": page,
"username": username,
"password": password,
})
}) /*
curl "http://localhost:8080/posts?id=9876&page=7" -X POST -d 'username=geektutu&password=1234' {"id":"9876","page":"7","password":"geektutu","username":"geektutu"}%
*/
Map参数(字典参数)
// Map参数(字典参数)
r.POST("/post", func(c *gin.Context) {
ids := c.QueryMap("ids")
names := c.PostFormMap("names") c.JSON(http.StatusOK,gin.H{
"ids": ids,
"names": names,
})
}) /*
curl -g "http://localhost:8080/post?ids[Jack]=001&ids[Tom]=002" -X POST -d 'names[a]=Sam&names[b]=David'
{"ids":{"Jack":"001","Tom":"002"},"names":{"a":"Sam","b":"David"}}%
*/
重定向(Redirect)
r.GET("/redirect", func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently,"/index")
}) r.GET("/index", func(c *gin.Context) {
c.Request.URL.Path = "/"
r.HandleContext(c)
}) /*
curl http://127.0.0.1:8080/redirect -i
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: /index
Date: Tue, 27 Oct 2020 07:40:25 GMT
Content-Length: 41
*/
分组路由

如果有一组路由,前缀都是/api/v1开头,是否每个路由都需要加上/api/v1这个前缀呢?答案是不需要,分组路由可以解决这个问题。利用分组路由还可以更好地实现权限控制,例如将需要登录鉴权的路由放到同一分组中去,简化权限控制。

// group routes 分组路由
defaultHandler := func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"path": c.FullPath(),
})
}
// group: v1
v1 := r.Group("/v1")
{
v1.GET("/posts", defaultHandler)
v1.GET("/series", defaultHandler)
}
// group: v2
v2 := r.Group("/v2")
{
v2.GET("/posts", defaultHandler)
v2.GET("/series", defaultHandler)
} /*
curl http://localhost:8080/v1/posts
{"path":"/v1/posts"}
curl http://localhost:8080/v2/posts
{"path":"/v2/posts"}
*/

01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)的更多相关文章

  1. Go语言基础之20--web编程框架之Gin框架

    一.Gin框架介绍 1.1 简介 A. 基于httprouter开发的web框架. http://github.com/julienschmidt/httprouter B. 提供Martini风格的 ...

  2. 02 . Go框架之Gin框架从入门到熟悉(数据解析和绑定,渲染,重定向,同步异步,中间件)

    数据解析和绑定 json数据解析和绑定 package main import ( "github.com/gin-gonic/gin" "net/http" ...

  3. 03 . Go框架之Gin框架从入门到熟悉(Cookie和Session,数据库操作)

    Cookie Cookie是什么 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分两次请求是否由同一个客户端发出 Cookie就是解决HTTP协议无状态的方案之一,中文是小 ...

  4. Django框架之序列化和上传文件

     一.Django的序列化(对于ajax请求) Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1)django序列化的使用方法 . ...

  5. django框架 input 文本框 单选框 多选框 上传文件 等数据传输后台的程序 request.getlist接收多个结果 obj.chunks 用于文件传输 enctype="multipart/form-data文件传输必备表头

    在上一个博客中,我们学习了如果创建django,这里我们主要讲如何把数据传给后台 在url文件中, 从app01中导入views, 以及创建url(r'^login/', views.login) f ...

  6. Web框架之Gin

    Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...

  7. Gin框架介绍及使用

    Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...

  8. gin框架中间件

    1. Gin框架中间件Gin框架中间件A. Gin框架允许在请求处理过程中,加入用户自己的钩子函数.这个钩子函数就叫中间件B. 因此,可以使用中间件处理一些公共业务逻辑,比如耗时统计,日志打印,登陆校 ...

  9. Web框架之Gin介绍及使用

    Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和高效的追求者, 你会爱上Gin. ...

随机推荐

  1. volatile关键字解释和使用

    一.java内存模型的相关概念:原子性.可见性与有序性 原子性: 原子是世界上的最小单位,具有不可分割性.比如 a=0:(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原 ...

  2. [阅读笔记]Attention Is All You Need - Transformer结构

    Transformer 本文介绍了Transformer结构, 是一种encoder-decoder, 用来处理序列问题, 常用在NLP相关问题中. 与传统的专门处理序列问题的encoder-deco ...

  3. JAVA并发笔记

    重入锁的特性, 避免死锁, 如果有锁的话, 不用重新加锁, 直接增加锁的次数.. Synchronize, ReentrantLock都是重入锁. 读写锁, ReentrantReadWriteLoc ...

  4. BeautifulSoup使用手册(查询篇)

    目录 开始使用呢 解析器 四种对象 tag对象 标签名(name) 属性值(Attributes) 多值属性 内容 Comment对象 prettify()方法 find_all方法 contents ...

  5. 04 sublime text 3在线安装package control插件,之后安装主题插件和ConvertToUTF8 插件

    前提:需要@@科学@@上网 在线安装包通常都需要@@科学@@上网 安装package control插件 在线安装package control插件 按ctrl+shift+p 输入install,选 ...

  6. Opencv的imread用法

    所有参考来自网上仅仅做学习记录用,具体正确性需要在具体项目各自验证,不涉及具体错误代码处理调试等问题,欢迎发现发现问题~ 参考: 1. https://blog.csdn.net/LiheZhu/ar ...

  7. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...

  8. rxjs入门7之其它操作符复习

    一.辅助类操作符 二.过滤数据流 三.转化数据流 四.异常错误处理 五.多播 ,Subject类型

  9. Jenkins从节点上构建自动化测试项目时报错:java.io.IOException: Unexpected termination of the channel

    在mac电脑上配置了Jenkins从节点,在该从节点上构建app UI 自动化测试项目,运行一些用例后报如下错误: java.io.EOFException at java.io.ObjectInpu ...

  10. C#数据结构-栈

    栈的定义不需要多说,相信大家都非常熟悉,但是,在实际应用中栈的应用我们很少想到会去用栈结构,先上代码看下用法: Stack st = new Stack(); st.Push('A'); st.Pus ...