Gin框架介绍

Gin是一个用Go语言编写的web框架。它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍。
中文文档

Gin框架安装与使用

安装GIN

$ go get -u github.com/gin-gonic/gin

第一个Gin程序

package main

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

func main() {
// 创建一个默认的路由引擎
engine := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
engine.GET("/hello", func(context *gin.Context) {
//返回JSON格式的数据
context.JSON(200, gin.H{
"message": "Hello ares!",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
engine.Run()
}
-----------------
$curl 127.0.0.1:8080/hello
{"message":"Hello ares!"}

Gin网络请求与路由处理

创建Engine

Engine被定义成一个结构体,默认可以使用gin.Default()和gin.New()创建。区别在于gin.Default()也适用gin.New()创建engine实例,但是会默认使用Logger和Recover中间件。
Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试; Recovery中间件的作如果程序执行过程中遇到panc中断了服务,则 Recovery会恢复程序执行,并返回服务器500内误。通常情况下,我们使用默认的gin.Defaul创建 Engine实例。

Handle处理Get请求

附带name默认值

engine := gin.Default()
//get,http://127.0.0.1:8080/hello?name=wx
engine.Handle("GET", "/hello", func(context *gin.Context) {
path := context.FullPath()
fmt.Println(path)
//获取name参数,默认为ares
name := context.DefaultQuery("name", "ares")
fmt.Println(name)
context.Writer.Write([]byte("Hello " + name))
})

通过 Handle方法第一个参数指定处理GET类型的请求,解析的接囗是/ hello。
Context是gin框架中封装的一个结构体,这是gn框架中最重要,最基础的一个结构体对象。该结构体可以提供我们操作请求,处理请求,获取数据等相关的操作,通常称之为上下文对象,简单说为我们提供操作环境可以通过 context. Query和 context. DefaultQuery获取GET请求携带的参数。
engine可以直接解析方法,按照以下方式。

//get,http://127.0.0.1:8080/hello?name=wx
engine.GET("/hello", func(context *gin.Context) {
fmt.Println(context.FullPath())
name := context.Query("name")
fmt.Println(name)
context.Writer.Write([]byte("hello" + name))
})

Handle处理Post,Delete请求

engine := gin.Default()
engine.POST("/login", func(context *gin.Context) {
fmt.Println(context.FullPath())
username, exist := context.GetPostForm("username")
if exist {
fmt.Println(username)
}
context.Writer.Write([]byte("hello" + username))
})
engine.DELETE("/user/:id", func(context *gin.Context) {
fmt.Println(context.FullPath())
//获取id
userID := context.Param("id")
fmt.Println(userID)
context.Writer.Write([]byte("删除id" + userID))
})
engine.Run()

Gin表单实体绑定

使用 PostForm这种单个获取属性和字段的方式,代码量较多,需要一个一个属性进行获取。而表单数据的提交,往往对应着完整的数据结构体定义,其中对应着表单的输入项。gin框架提供了数据结构体和表单提交数据绑定的功能,提高表单数据获取的效率。

ShouldBindQuery(Get)

ShouldBindQuery可以实现Get方式的数据请求绑定。

type Student struct {
Name string `form:"name"`
Classes string `form:"classes"`
} func main() {
engine := gin.Default()
//请求数据绑定,定义结构体
engine.GET("/hello", func(context *gin.Context) {
fmt.Println(context.FullPath()) var student Student
err := context.ShouldBindQuery(&student)
if err != nil {
log.Fatal(err.Error())
return
}
fmt.Println(student.Classes)
fmt.Println(student.Name)
context.Writer.Write([]byte("hello" + " " + student.Name + " " + student.Classes))
})
engine.Run()
}

ShouldBind(Post)

ShouldBind可以实现Post方式的数据请求绑定。

type Resiter struct {
Name string `form:"name"`
Password string `form:"password"`
} func main() {
engine := gin.Default()
engine.POST("/register", func(context *gin.Context) {
fmt.Println(context.FullPath())
var resiter Resiter
err := context.ShouldBind(&resiter)
if err != nil {
log.Fatal(err.Error())
return
}
fmt.Println(resiter.Name)
fmt.Println(resiter.Password)
context.Writer.Write([]byte(resiter.Name + " " +"resiter"))
})
engine.Run()
}

BindJSON(处理json格式数据)

结构体格式务必正确。

type Person struct {
Name string `form:"name"`
Age int `form:"age"`
} func main() {
engine := gin.Default()
engine.POST("/add", func(context *gin.Context) {
fmt.Println(context.FullPath())
var person Person
err := context.BindJSON(&person)
if err != nil {
log.Fatal(err.Error())
return
}
fmt.Println("name:", person.Name)
fmt.Println("age:", person.Age)
context.Writer.Write([]byte("添加" + " " + person.Name))
}) engine.Run()
}

Gin多数据格式返回请求结果

[]byte切片类型

func main() {
engine := gin.Default()
engine.GET("/byte", func(context *gin.Context) {
fmt.Println(context.FullPath())
fullpath := context.FullPath()
context.Writer.Write([]byte(fullpath))
})
engine.Run()
}

Json类型

项目开发中,json格式使用更为普遍。
Gin为了方便开发者更方便的使用该框架进行项目开发,直接支持将返回数据组装成JSON格式进行返回。
Gin框架中的context包含的JsoN方法可以将结构体类型的数据转换成JSON格式的结构化数据,然后返回给客户端。

type Stu struct {
Name string
Id int
Extra string
} func main() {
engine := gin.Default()
//map类型
//调用JSON将map类型数据转换为json格式返回给前端,第一个参数200表示设置请求返回的状态码,和http请求状态码一样
engine.GET("/hellojson", func(context *gin.Context) {
fmt.Println(context.FullPath())
fullpath := context.FullPath()
context.JSON(200, map[string]interface{}{
"code": 1,
"msg": "ok",
"date": fullpath,
})
})
//结构体类型
engine.GET("/helloStruct", func(context *gin.Context) {
fmt.Println(context.FullPath())
fullpath := context.FullPath()
var stu Stu
stu.Name = "ares"
stu.Id = 1
stu.Extra = fullpath
context.JSON(200, &stu)
})
engine.Run()
}
------------------------
$ curl 127.0.0.1:8080/hellojson
{"code":1,"date":"/hellojson","msg":"ok"}
$ curl 127.0.0.1:8080/helloStruct
{"Name":"ares","Id":1,"Extra":"/helloStruct"}

HTML模板

Gin框架还支持返回HTML格式的数据,可以直接渲染HTML页面。需要将静态资源路径设置正确才会生效。


func main() {
engine := gin.Default()
//加载html路径
engine.LoadHTMLGlob("./html/*")
//engine.LoadHTMLGlob("../html/*")
//加载静态资源路径
engine.Static("/image", "./image")
engine.GET("/html", func(context *gin.Context) {
fullpath := "路径" + context.FullPath()
fmt.Println(fullpath) context.HTML(http.StatusOK, "index.html", gin.H{
"fullpath": fullpath,
})
})
engine.Run()
}

html页面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>GIN ares</title>
</head>
<body>
<h1>GIN</h1>
{{.fullpath}}
<br>
<img src="../image/shui.jpeg">
</body>
</html>

使用路由组分类处理请求

实际项目中,均为模块化开发,同一模块内的功能接口庙会有相同的接口前缀,如下:

注册:127.0.0.1:8080/user/register
登录:127.0.0.1:8080/user/login
删除:127.0.0.1:8080/user/delete

GIN框架中可使用路由组来实现路由分类。

//定义user结构体
type User struct {
Name string `form:"name"`
} //简洁main函数,把登录handle单独拿出来
func loginHandle(context *gin.Context) {
fullpath := "登录" + context.FullPath()
fmt.Println(fullpath)
var user User
err := context.ShouldBind(&user)
if err != nil {
log.Fatal(err.Error())
return
}
context.Writer.Write([]byte(fullpath + " " + user.Name))
} //删除handle
func deleteHandle(context *gin.Context) {
fullpath := "删除" + context.FullPath()
ID := context.Param("id")
fmt.Println(fullpath + " " + ID)
context.Writer.Write([]byte(fullpath + " " + ID))
}
func main() {
engine := gin.Default() routeGroup := engine.Group("/user")
//注册
routeGroup.POST("/register", func(context *gin.Context) {
fullpath := "注册" + context.FullPath()
fmt.Println(fullpath)
context.Writer.Write([]byte(fullpath))
})
//登录
routeGroup.POST("/login", loginHandle)
//删除
routeGroup.POST("/delete", deleteHandle)
engine.Run()
}

GO语言GIN框架入门的更多相关文章

  1. Go语言web框架 gin

    Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所 ...

  2. GO语言web框架Gin之完全指南

    GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...

  3. 01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)

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

  4. golang(gin框架),基于RESTFUL的跨语言远程通信尝试

    golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景: 在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot. 实训实际给我们讲课以 ...

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

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

  6. Go最火的Gin框架简单入门

    Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:htt ...

  7. GO语言web框架Gin之完全指南(二)

    这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...

  8. Swift语言Auto Layout入门教程:上篇

    原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...

  9. 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证

    本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...

随机推荐

  1. Flink入门 - 窗口函数

    /* * ProcessWinFunOnWindow */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamEx ...

  2. Alpha_5

    一. 站立式会议照片 二. 工作进展 (1) 昨天已完成的工作 a. 我的·蜕变记录,我的·我的卡包,我的·习惯简记页面设计 b. 数据统计和数据详情页面设计 c. 实现自定义习惯图片和获取卡片功能页 ...

  3. Hive性能优化【严格模式、join优化、Map-Side聚合、JVM重用】

    一.严格模式 通过设置以下参数开启严格模式: >set hive.mapred.mode=strict;[默认为nonstrict非严格模式] 查询限制: 1.对于分区表,必须添加where查询 ...

  4. C#创建DataTable(转载)

    来源:https://www.cnblogs.com/xietianjiao/p/11213121.html方法一: DataTable tblDatas = new DataTable(" ...

  5. 关于 Spring AOP (AspectJ) 你该知晓的一切

    版权声明:本文为CSDN博主「zejian_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/javazej ...

  6. FreeBSD设置开机同步时间

    没有设置开机同步时间的话,重启之后时间不对. 如果装机时没正确设置时区,先设置时区:# tzsetup 用date命令手工设置时间一方面不方便,另一方面也依赖于本地管理员的时钟的正确性,那么网络上不同 ...

  7. Mariadb/MySQL多实例实战

    Mariadb/MySQL多实例实战 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.安装MySQL程序 无论你喜欢哪种方式安装均可,关于源码安装,yum安装或者二进制安装,可以 ...

  8. IDEA中css文件包红色下划线

    选中该文件,右键 -> Analyze -> Configure Current File Analysis... Highlighting Level置为None

  9. python开发笔记-如何做数据准备

    时间格式: >>> from datetime import date >>> firstday = date.fromtimestamp(1464010200) ...

  10. onreadystatechange和onload区别分析

    onreadystatechange和onload区别分析   script加载 IE的script 元素只支持onreadystatechange事件,不支持onload事件. FireFox,Op ...