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. 喜大普奔!GitHub中文版帮助文档上线了!

    日前,GitHub 文档的简体中文正式发布,开发者可以到官方文档上随意查阅浏览中文文档啦!   对于想要玩 GitHub,但一直苦于英语水平较差的程序员来说,这真是一个天大的好消息.下面一起来感受一下 ...

  2. 【Processing-日常1】小圆碰撞

    之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79741637

  3. netty第一讲 创建

    1.新建一个maven项目  https://blog.csdn.net/yanghaibobo110/article/details/73835469 2.netty是什么玩意 官方那个给出的介绍是 ...

  4. MacOS如何正确配置Idea自带Maven插件的环境变量?(亲测)

    背景 安装了IDEA开发工具,想执行Maven的命令.但是又没有通过自己下载Maven的安装包进行安装,只是想直接使用IDEA自带的Maven插件来执行Maven的各种命令.由于刚开始使用macos对 ...

  5. Beyond Compare 3, 简体中文版 安装

    转载: 1.https://www.scootersoftware.com/download.php 2.http://www.scootersoftware.com/download.php 下载地 ...

  6. Java中的对象都是在堆上分配的吗?

    作者:LittleMagic https://www.jianshu.com/p/8377e09971b8 为了防止歧义,可以换个说法: Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定 ...

  7. devops-jenkins-Pipeline基础语法

    1. jenkins-Pipeline基础语法  1) jenkins-Pipeline总体介绍 • Pipeline,简而言之,就是一套运行与jenkins上的工作流框架,将原本独立运行于单个或多个 ...

  8. CMD/ENTROYPOINT区别

    CMD/ENTROYPOINT区别 相同点:都是指定一个容器:启动时要运行的命令 不同点(重点): CMD: dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker ...

  9. GUI版本的emacs

    概要 emacs 配置 X11 配置 输入法配置 spacemacs 中的配置 fcitx 汉字显示方块的问题 总结 优势 劣势 概要 之前一直使用 terminal 版本的 emacs, 性能和显示 ...

  10. 多测师讲解_肖sir _rf报错归纳(1):

    错误一: 报错原因:文件格式 解决方案: 修改文件格式,将txt改成robot格式   错误二: rf 运行以后出现乱码现象 解决方案: 打开python的安装路径下:C:\python37\Lib\ ...