从零开发区块链应用--gin框架使用
Posted 看见月亮的人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开发区块链应用--gin框架使用相关的知识,希望对你有一定的参考价值。
文章目录
参考文档:
- Gin框架介绍及使用:https://www.tianyuan.fun/posts/golang/go-use-of-gin-framework.html
一、Gin 框架介绍
Gin 是一个用 Go 语言编写的 web 微框架,封装比较优雅,API 友好,具有快速灵活,容错方便等特点。它是一个类似于 martini 但拥有更好性能的 API 框架,由于使用了 httpprouter,速度提高了近 40 倍。如果你是性能和高效的追求者,你会爱上 Gin。
Go 世界里最流行的 Web 框架,Github 上有 46k+star。基于 httprouter 开发的 Web 框架。中文文档齐全,简单易用的轻量级框架。
二、Gin安装
- 下载并安装 gin:
go get -u github.com/gin-gonic/gin
- 将 gin 引入到代码中:
import "github.com/gin-gonic/gin"
三、Gin使用
package api
import (
"github.com/gin-gonic/gin"
)
func RouterStart()
// 创建一个路由引擎
router := gin.New()
// 创建一个默认的路由引擎
router := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
// gin.Context封装了Request和Response
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()
3.1 设置gin模式
gin.SetMode(gin.ReleaseMode)
查看gin源码,可发现gin框架提供了下列三种模式。
const (
// DebugMode indicates gin mode is debug.
DebugMode = "debug"
// ReleaseMode indicates gin mode is release.
ReleaseMode = "release"
// TestMode indicates gin mode is test.
TestMode = "test"
)
我们每次启动gin框架,如果不设置以下gin模式
gin.SetMode(gin.ReleaseMode)
程序则会输出一段提示
[WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
所以,现在我们就可以明白了,这三种mode分别对应了不同的场景。在我们开发调试过程中,使用debug模式就可以了。在上线的时候,一定要选择release模式。而test可以用在测试场景中。
3.2 创建新路由
//创建一个路由引擎
router := gin.New()
// 创建一个默认的路由引擎
router := gin.Default()
gin.Default() 和 gin.New() 的区别在于 gin.Default() 也使用 gin.New() 创建engine实例,但是会默认使用 Logger 和 Recovery 中间件。
- Logger 是负责进行打印并输出日志的中间件,方便开发者进行程序调试;
- Recovery 中间件的作用是如果程序执行过程中遇到 panic 中断了服务,则 Recovery 会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的 gin.Default() 创建 router 实例。
3.3 创建多路由分组
chain := router.Group("/api/admin")
我们把一个模块相关的方法都写在一个路由下。便于管理和查找相关的代码。
Gin框架正好为我们提供了这个方法。
代码举例如下
//v1组路由
v1:=router.Group("/v1")
v1.GET("/login", loginEndpoint)
v1.GET("/submit", submitEndpoint)
v1.GET("/read", readEndpoint)
//v2组路由
v2:=router.Group("/v2")
v2.GET("/login", loginEndpoint)
v2.GET("/submit", submitEndpoint)
v2.GET("/read", readEndpoint)
3.4 创建路由
// 新增banner
chain.POST("/banner/add", handler.AddBanner)
- POST:请求方式;另外例如GET
- /banner/add:请求的二级路径
- handler.AddBanner:执行函数
当客户端以POST方法请求…/banner/add 路径时,会执行后面的函数
3.5 编写接口执行函数
func AddBanner(ctx *gin.Context)
- gin.Context封装了Request和Response
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
故:当需要获取客户机提交过来的数据时,找request对象就行了。
当需要向客户机输出数据,找response对象。
3.6 启动服务
router.Run(config.Conf.Console.Port)
- 启动HTTP服务,从配置文件中获取当前服务启动的端口
默认在0.0.0.0:8080启动服务
四、gin框架获取参数
4.1 获取query参数
query指的是URL ? 后面携带的参数,例如user/info?username=张三&password=123。获取请求的query参数的方法如下:
- 当使用
DefaultQuery
时,如果没有获取到浏览器输入的username,则返回设置defaultValue
username := c.DefaultQuery("username","张三")
- 当使用
Query
时,如果没有获取到浏览器输入的password,则默认返回""空串
password := c.Query("password")
完整示例如下
浏览器输入为:
http://127.0.0.1:8000/user/info?username=张三&password=123456
后端处理逻辑如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main()
// 创建一个默认的路由引擎
r := gin.New()
// GET:请求方式; /hello:请求的路径
r.GET("/user/info", func(ctx *gin.Context)
// 当使用DefaultQuery时,如果没有获取到浏览器输入的username,则返回设置defaultValue给username
username := ctx.DefaultQuery("username", "张三")
// 当使用Query时,如果没有获取到浏览器输入的password,则默认返回""空串
password := ctx.Query("password")
// 返回json给浏览器
c.JSON(http.StatusOK, gin.H
"message": "success",
"username": username,
"password": password,
)
)
// 启动HTTP服务,默认在8080端口启动服务,也可以设置为其他端口如8000
r.Run(":8000")
注:一般使用Query方法
4.2 获取form表单参数
当前端请求的数据通过form表单提交时,例如向/user/info发送一个POST请求,获取请求数据的方式如下:
完整示例如下
后端处理逻辑如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main()
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式; /hello:请求的路径
r.POST("/user/info", func(ctx *gin.Context)
//提交单个表单数据时
//如果没有在请求中获取到表单参数,则返回默认值"张三"
username := ctx.DefaultPostForm("username", "张三")
//如果没有在请求中获取到表单参宿,则返回""空串
password := ctx.PostForm("password")
//提交复选框多个数据时
info := ctx.PostFormArray("info")
// 输出json结果给调用方
c.JSON(http.StatusOK, gin.H
"message": "success",
"username": username,
"password": password,
"info": info,
)
)
// 启动HTTP服务,默认在8080端口启动服务,也可以设置为其他端口如8000
r.Run(":8000")
注:一般使用PostForm方法
4.3 获取JSON参数
当前端请求的数据通过json提交时,例如向/user/info发送一个POST请求,则获取请求参数的方式如下:
后端处理逻辑如下:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
type User struct
// 如果想要指定返回的json为其他别名,则可以使用`json:"username"`定义json格式的别名
UserName string `json:"username"`
PassWord string `json:"password"`
func main()
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式; /hello:请求的路径
r.POST("/user/info", func(ctx *gin.Context)
// 创建一个json结构体实例并与请求json参数绑定
var userBody User
err := ctx.BindJSON(&userBody)
// 判断json请求数据结构与定义的结构体有没有绑定成功
if err != nil
ctx.JSON(200, gin.H
"err_no": 400,
"message": "Post Data Err",
)
else
ctx.JSON(http.StatusOK, gin.H
"username": userBody.UserName,
"password": userBody.PassWord,
)
)
// 启动HTTP服务,默认在8080端口启动服务,也可以设置为其他端口如8000
r.Run(":8000")
以上是关于从零开发区块链应用--gin框架使用的主要内容,如果未能解决你的问题,请参考以下文章