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. Java自学-类和对象 继承

    什么是 Java的 继承 ? 在LOL中,武器是物品的一种,也是有名称和价格的 所以在设计类的时候,可以让武器继承物品,从而继承名称和价格属性 步骤 1 : 物品类Item 物品类Item 有属性 n ...

  2. RTP包的结构

    live555中数据的发送最后是要使用RTP协议发送的,下面介绍一下RTP包格式. RTP packet RTP是基于UDP协议的,RTP服务器会通过UDP协议,通常每次会发送一个RTP packet ...

  3. Flask项目初始化

    数据库实现命令初始化 1.实现命令主脚本 # coding=utf-8 from functools import wraps from getpass import getpass import s ...

  4. CNN原理

    卷积神经网络(Convolutional Neural Network)的结构类似于神经网络,可以看做是对其的改进.它利用局部连接.权值共享.多核卷积.池化四个手段大大降低了参数的数目,使得网络的层数 ...

  5. day 26作业

    作业 1.整理TCP三次握手.四次挥手图 三次握手 起初A和B都处于CLOSED状态--B创建TCB,处于LISTEN状态,等待A请求--A创建TCB,发送连接请求(SYN=1,seq=x),进入SY ...

  6. Python学习日记(三十四) Mysql数据库篇 二

    外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...

  7. sublime text3常用的一些快捷键

    --------------------------------下面的内容可以打印出来贴在电脑旁提醒自己-------------------- Ctrl + Shift + D  快速复制当前的一行 ...

  8. 升级openssh漏洞

    升级openssl和openssh 最近接收到客户的漏洞提醒,openssl和openssh的漏洞,解决办法就只有升级. 升级前环境 ~]# ssh -V OpenSSH_5.3p1, OpenSSL ...

  9. pyecharts绘制geo地图

    pyecharts是一种非常强大的绘图python库,绘制的图形非常好看,并且有代表性,不仅仅是地图,还可以绘制条形图.饼图.词云图等等. # 安装方法 pip install pyecharts # ...

  10. Linux-普通用户切换为root身份

    Linux 下普通用户免密码切换 root 用户 具体步骤: 1)编辑 su 文件打开第四行注释 # vim /etc/pam.d/su 2)将用户添加到 wheel 组 # usermod -G w ...