GO语言GIN框架入门
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框架入门的更多相关文章
- Go语言web框架 gin
Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所 ...
- GO语言web框架Gin之完全指南
GO语言web框架Gin之完全指南 作为一款企业级生产力的web框架,gin的优势是显而易见的,高性能,轻量级,易用的api,以及众多的使用者,都为这个框架注入了可靠的因素.截止目前为止,github ...
- 01 . Go框架之Gin框架从入门到熟悉(路由和上传文件)
Gin框架简介 Gin是使用Go/Golang语言实现的HTTP Web框架, 接口简洁, 性能极高,截止1.4.0版本,包含测试代码,仅14K, 其中测试代码9K, 也就是说测试源码仅5k左右, 具 ...
- golang(gin框架),基于RESTFUL的跨语言远程通信尝试
golang(gin框架),基于RESTFUL的跨语言远程通信尝试 背景: 在今年的项目实训过程中,遇到了这样的问题: 企业老师讲课实用的技术栈是Java springboot. 实训实际给我们讲课以 ...
- Go语言基础之20--web编程框架之Gin框架
一.Gin框架介绍 1.1 简介 A. 基于httprouter开发的web框架. http://github.com/julienschmidt/httprouter B. 提供Martini风格的 ...
- Go最火的Gin框架简单入门
Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:htt ...
- GO语言web框架Gin之完全指南(二)
这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...
- Swift语言Auto Layout入门教程:上篇
原文:Beginning Auto Layout Tutorial in Swift: Part 1/2,译者:@TurtleFromMars 开始用自动布局约束的方式思考吧! 更新记录:该教程由Br ...
- 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证
本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...
随机推荐
- Oracle 逻辑存储结构
一.总述 逻辑存储结构是 Oracle 数据库存储结构的核心内容,对 Oracle 数据库的所有操作都会涉及逻辑存储结构.逻辑存储结构是从逻辑的角度分析数据库的组成,是对数据存储结构在逻辑概念上的划分 ...
- 珠宝juelrye英语juelrye宝石
jewellery (usually uncountable, plural jewelleries) 1.(British spelling, Canadian) Collectively, per ...
- SpringBoot加载配置文件(@PropertySource@importSource@Value)
情景描述 最近新搭建了一个项目,从Spring迁到了Springboot,为了兼容Spring加载配置文件的风格,所以还想把PropertyPlaceholderConfigurer放在.xml文件里 ...
- springboot自定义CORS&XSS拦截器
springboot 项目前后端接口,防止xss攻击以及跨域问题解决 1.启动类添加注解 @ServletComponentScan 2.cors的拦截类 package com.longfor.hr ...
- Linux实验:hdfs shell基本命令操作(二)
[实验目的] 1)熟练hdfs shell命令操作 2)理解hdfs shell和linux shell命令[实验原理] 安装好hadoop环境之后,可以执行hdfs shell命令 ...
- 线程中的join方法,与synchronized和wait()和notify()的关系
什么时候要用join()方法? 1,join方法是Thread类中的方法,主线程执行完start()方法,线程就进入就绪状态,虚拟机最终会执行run方法进入运行状态.此时.主线程跳出start方法往下 ...
- 嵌入式Linux框架的理解
从事嵌入式linux工作也几年了,如果算上大学期间的自学,那么也算是个工程师了.期间写过底层bootloader.内核的驱动和上层应用程序.对于芯片内部的模块也在大学时候用fpga的verilog玩过 ...
- python+BeautifulSoup+多进程爬取糗事百科图片
用到的库: import requests import os from bs4 import BeautifulSoup import time from multiprocessing impor ...
- django 项目需要注意的一些点
1.创建新项目 把静态文件夹的名字放在settings文件里面 STATIC_URL = '/static/' STATICFILES_DIRS=[ os.path.join(BASE_DIR, ...
- CodeForces - 76F:Tourist (旋转坐标系,LIS)
pro:有一个驴友,以及给定N个表演地点xi和时间ti,驴友的速度不能超过V. 问他在起点为原点和不设置起点的情况下分别最多参观多少个表演. sol:BZOJ接飞饼见过:clari也在camp的DP专 ...