当前位置: 首页 > wzjs >正文

菏泽做网站推广郑州高端网站建设

菏泽做网站推广,郑州高端网站建设,制作企业网站首页效果图,顺德网站建设收费标准为什么选择Gin框架? Gin 是一个基于 Go 语言的高性能 Web 框架,具备以下优势: 轻量高效:底层依赖 net/http,性能接近原生。简洁优雅:API 设计友好,支持路由分组、中间件链、参数绑定等特性。生…

为什么选择Gin框架?

Gin 是一个基于 Go 语言的高性能 Web 框架,具备以下优势:

  • 轻量高效:底层依赖 net/http,性能接近原生。
  • 简洁优雅:API 设计友好,支持路由分组、中间件链、参数绑定等特性。
  • 生态丰富:内置 JSON 解析、日志记录、错误恢复等实用功能,社区插件生态完善。
  • 无论是构建 RESTful API 还是全栈应用,Gin 都能显著提升开发效率。

安装

要安装Gin软件包,您需要安装Go并首先设置Go工作区。

  • 首先需要安装Go(需要1.10+版本),然后可以使用下面的Go命令安装Gin。
go get -u github.com/gin-gonic/gin
  • 将其导入您的代码中:
import "github.com/gin-gonic/gin"

基础示例

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 1.创建 (实例化gin.Engine结构体对象)r := gin.Default()// 2.绑定路由规则,执行的函数// gin.Context,封装了request和responser.GET("/", func(c *gin.Context) {c.String(http.StatusOK, "Hello, Gin!")})// 3.监听端口,默认在8080//  Run("里面不指定端口号默认为8080")r.Run(":8080")
}

运行后访问 http://localhost:8080,即可看到返回的字符串。

Gin工工作作流流程

核心概念

  • Engine 容器对象,整个框架的基础
  • Engine.tree 负责存储路由和handle方法的映射,采用类似于字典树的结构
  • Engine.RouterGroup 其中handlers存储着所有中间件
  • Context 上下文对象,负责处理 请求回应 ,其中handles的存储处理请求时中间件和处理方法的

在这里插入图片描述

请求处理 流程

在这里插入图片描述

GIN启动流程

Gin初始化----> Use 中间件  ---->  注册Routers路由 ----> RUN()启动

Gin原原理解析

参考资料:http://v5blog.cn/pages/dd7d5a/

gin.Default()

Default()跟New()几乎一模一样, 就是调用了gin内置的Logger(), Recovery()中间件

// Default返回一个已经附加了Logger和Recovery中间件的Engine实例
func Default() *Engine {debugPrintWARNINGDefault()engine := New() "# 默认实例// 注册中间建,中间件的是一个函数,最终只要返回一个 type HandlerFunc func(*Context) 就可以engine.Use(Logger(), Recovery()) // 默认注册的两个中间件return engine
}

engine := New() 初初始化始化

通过调用 gin.New() 方法来实例化 Engine容器

engine.Use() 注注册册中间件 中间件

在这里插入图片描述

路由与参数处理

无参路由

func HelloWorldhandler(ctx *gin.Context){ctx.JSON(200, gin.H{"message": "Hello World",})
}func main() {// 创建一个默认的路由器router := gin.Default()// gin.Context是一个结构体,包含了请求和响应的细节, 封装request和responserouter.GET("/",HelloWorldhandler)// 路由重定向router.GET("/re", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")})// 启动服务器router.Run(":8081")
}

动态路由参数

通过 :param 捕获 URL 中的变量:
(可以通过Context的Param方法来获取API参数)

r.GET("/book/:id", func(c *gin.Context) {bookID := c.Param("id")c.String(http.StatusOK, "书籍ID: %s", bookID)
})

查询参数

使用 Query 或 DefaultQuery 获取 URL 参数:
http://127.0.0.1:8000/user?name=zhangsan

r.GET("/user", func(c *gin.Context) {name := c.Query("name")role := c.DefaultQuery("role", "guest")c.JSON(200, gin.H{"name": name, "role": role})
})

ShouldBind参数绑定

通过 ShouldBind 自动解析请求体(支持 JSON、Form 等):

我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制
自动提取请求中 QueryString 、 form表单 、 JSON 、 XML 等参数到结构体中

type LoginForm struct {Username string `form:"username" binding:"required"`Password string `form:"password" binding:"required"`
}r.POST("/login", func(c *gin.Context) {var form LoginFormif err := c.ShouldBind(&form); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.String(200, "登录成功: %s", form.Username)
})

完整代码案例

package mainimport ("fmt""github.com/gin-gonic/gin""net/http"
)// HelloWorldhandler 无参数路由处理函数
func HelloWorldhandler(ctx *gin.Context){ctx.JSON(200, gin.H{"message": "Hello World",})
}func GetBookDetailHandler(ctx *gin.Context )  {bookId := ctx.Param("id")ctx.String(http.StatusOK, fmt.Sprintf("成功获取书籍详情:%s", bookId))}func GetUserDetailHandlers(ctx *gin.Context)   {username := ctx.Query("username")ctx.String(http.StatusOK, fmt.Sprintf("成功获取用户详情:%s", username))
}type Login struct {Username string `form:"username" json:"username" binding:"required"`Password string `form:"password" json:"password" binding:"required"`
}func ResponseJsonHandler(c *gin.Context) {type Data struct {Msg string `json:"msg:"`Code int    `json:"code"`}d := Data{Msg: "success",Code: 200,}c.JSON(http.StatusOK, d)
}
func Loginhandler(c *gin.Context)  {var login Loginif err := c.ShouldBind(&login); err == nil {c.JSON(http.StatusOK, gin.H{"username": login.Username,"password": login.Password,})} else {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})}
}func ResponseStringHandle(c *gin.Context)  {c.String(http.StatusOK, "Hello World")
}func main() {// 创建一个默认的路由器router := gin.Default()// gin.Context是一个结构体,包含了请求和响应的细节, 封装request和response// 无参数路由router.GET("/",HelloWorldhandler)// 返回字符串router.GET("/string", ResponseStringHandle)// 返回jsonrouter.GET("/json", ResponseJsonHandler)// 动态路由参数router.GET("/book/:id", GetBookDetailHandler)// 查询参数 Query 或 DefaultQueryrouter.GET("/user/", GetUserDetailHandlers)// 参数绑定router.POST("/login", Loginhandler)// 路由重定向router.GET("/re", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "https://www.baidu.com")})// 启动服务器router.Run(":8081")
}

路由分发

为什么需要路由分发?

  • 我们一个项目有非常多的模块,如果全部写在一块导致代码结构混乱,不利于后续的扩展
  • 按照大的模块,每个模块有自己独立的路由,主路由可以再main.go中进行注册

项目结构

├── go.mod
├── go.sum
├── main.go
└── routers├── books.go└── users.go

main.go


import (
"days/routers"
"fmt"
"github.com/gin-gonic/gin"
)
func main() {router := gin.Default()// 全局中间件router.Use(MiddleWare())// 加载路由routers.LoadUsers(router)routers.LoadBooks(router)router.Run(":8081")
}

routers/users.go

package routers
import ("fmt""github.com/gin-gonic/gin""net/http""time"
)func LoadUsers(e *gin.Engine)  {e.GET("/user",MiddleWareOne(),UserHandler)
}func UserHandler(c *gin.Context) {fmt.Println("我是用户路由")time.Sleep(time.Second * 5)c.JSON(http.StatusOK,gin.H{"message" : "weclome user",})
}

routers/books.go

package routers
import (
"net/http"
"github.com/gin-gonic/gin"
)
func LoadBooks(e *gin.Engine) {e.GET("/book", GetBookHandler)
}
func GetBookHandler(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Book Router",})
}

在这里插入图片描述

中间件

在这里插入图片描述

  • Gin框架允许开发者在处理请求的过程中,加入用户自己的钩子(Hook)函数。
  • 这个钩子函数就叫中间件,中间件适合处理一些公共的业务逻辑
  • 比如登录认证、权限校验、数据分页、记录日志、耗时统计等

全局中间件

func Logger() gin.HandlerFunc {return func(c *gin.Context) {start := time.Now()c.Next()latency := time.Since(start)fmt.Printf("请求耗时: %v\n", latency)}
}func main() {r := gin.Default()r.Use(Logger()) // 全局生效r.GET("/", func(c *gin.Context) { /* ... */ })
}

局部中间件

func AuthMiddleware() gin.HandlerFunc {return func(c *gin.Context) {token := c.GetHeader("token")if token != "SECRET_KEY" {c.AbortWithStatusJSON(401, gin.H{"error": "身份验证失败"})}c.Next()}
}r.GET("/profile", AuthMiddleware(), func(c *gin.Context) {c.JSON(200, gin.H{"data": "用户信息"})
})

next()方法

  • 在中间件中调用next()方法,会从next()方法调用的地方跳转到Handler函数
  • Handler函数执行完成,若中间件还有部分代码未执行(中间件中next()之后的代码),则执行该代码
    在这里插入图片描述
package mainimport ("fmt""github.com/gin-gonic/gin""net/http""time"
)func main() {r := gin.Default()r.Use(Log(), RequestID())r.GET("/", func(c *gin.Context) {fmt.Println("app running  1")time.Sleep(time.Second * 5)c.String(http.StatusOK, "hello World!")})r.Run()
}
func Log() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("log start")c.Next()fmt.Println("log end")}
}
func RequestID() gin.HandlerFunc {return func(c *gin.Context) {fmt.Println("requestid start")c.Next()fmt.Println("requestid end")}
}

实现token认证

  • http://127.0.0.1:8080/index index首页无需token直接访问
  • http://127.0.0.1:8080/home home家目录需要对token进行验证,验证通过才可访问
package mainimport ("fmt""github.com/gin-gonic/gin"
)func AuthMiddleWare() func(c *gin.Context)  {return func(c *gin.Context){// 客户端携带token 有三种方式 1.放在请求头 2.放在请求体 3.放在url// token 验证成功,返回 c.next()才会继续,否则 c.Abort()token := c.Request.Header.Get("token")fmt.Println("获取token:",token)if token == "" {c.JSON(200, gin.H{"code": 401,"msg": "身份验证不通过",})c.Abort()}if token != "123456" {c.JSON(200, gin.H{"code": 401,"msg": "token错误",})c.Abort()}}
}func main()  {router := gin.Default()// 首页无需验证router.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "首页",})})// Home页面需要验证router.GET("/home", AuthMiddleWare(), func(c *gin.Context) {c.JSON(200, gin.H{"message": "Home页面",})})router.Run(":8081")
}

在这里插入图片描述


文章转载自:

http://SYtPRhqz.rzmkL.cn
http://uQoHC6BB.rzmkL.cn
http://MJE8NHUH.rzmkL.cn
http://6X8U6q3B.rzmkL.cn
http://WSedNz81.rzmkL.cn
http://q2yUlZvi.rzmkL.cn
http://oTQZcQYH.rzmkL.cn
http://tpBA0fL6.rzmkL.cn
http://vs4EHgSa.rzmkL.cn
http://nnKR7yPJ.rzmkL.cn
http://K1jJZkCM.rzmkL.cn
http://P4SX4oS6.rzmkL.cn
http://lkUb1hrD.rzmkL.cn
http://pvQUKsag.rzmkL.cn
http://ZfiAVNPr.rzmkL.cn
http://NfI2f113.rzmkL.cn
http://ZT6whhGc.rzmkL.cn
http://7UaIGpFh.rzmkL.cn
http://zcha91yp.rzmkL.cn
http://AORhoROu.rzmkL.cn
http://t9Ec6WnF.rzmkL.cn
http://qLgHsSdi.rzmkL.cn
http://jzMu2fto.rzmkL.cn
http://mdLeD8xa.rzmkL.cn
http://v31d6CxK.rzmkL.cn
http://VH8Pvdwk.rzmkL.cn
http://xdHo68Ij.rzmkL.cn
http://ezxDFIxR.rzmkL.cn
http://YAtxcVdX.rzmkL.cn
http://nS1bwZbo.rzmkL.cn
http://www.dtcms.com/wzjs/760597.html

相关文章:

  • 网站建设服务器软件内网门户网站建设要求
  • 备案网站地址o2o电子商务模式
  • h5页面制作网站华为云建站视频教程
  • 成都哪里做网站好网站设置地图
  • 教育培训机构怎么建设网站2k屏幕的网站怎么做
  • 怎么把自己电脑建设网站优质视频素材网站
  • wordpress 选择用户东莞网站建设白帽seo
  • 网站开发有前景吗广州冼村地铁站几号线
  • 网站发布平台做化工类网站内容
  • 可以做软文推广的网站专业开发网站建设
  • 做网站的产品图片做h5网站
  • 前台网站开发技术seo搜索引擎优化是利用
  • 做一个网站需要多少钱 怎么做seo如何优化网站步骤
  • 魔力百科网站做料理视频汕头网站关键词优化教程
  • 网站建设标准合同wordpress端口更改
  • 单页销售网站如何赚钱网页设计模板素材旅游
  • 系统网站怎么做的wordpress技术博客模板
  • 自学网站推荐上海网站高端
  • 玉树网站建设在线设计平台属于什么行业
  • 怎样创建网站发招聘信息教育培训加盟
  • vr看房网站开发费用微信小程序注册方式
  • 深圳手机网站建设报价网站建设与推广协议书
  • 帝国cms做淘宝客网站网站如何做关键词
  • 东台市住房和城乡建设局网站产品关键词的搜索渠道
  • 电子商务网站的建设与规划书江油市规划和建设局网站
  • 网站建设与运营合同投稿网站
  • 大连网站建设短期培训班新能源汽车车型
  • 安徽房产网站建设洞口网站开发公司推荐
  • 泉州网站建设推广怎么选择赣州网站建设
  • 赤壁市药监局网站建设方案如何给自己建设的网站设置登陆用户名和密码