自学内容网 自学内容网

Gin框架操作指南11:自定义与配置

官方文档地址(中文):https://gin-gonic.com/zh-cn/docs/
注:本教程采用工作区机制,所以一个项目下载了Gin框架,其余项目就无需重复下载,想了解的读者可阅读第一节:Gin操作指南:开山篇
本节演示自定义HTTP配置;自定义日志文件;自定义验证器。在开始之前,我们需要在”07自定义与配置“目录下打开命令行,执行如下命令来创建子目录:

mkdir  自定义HTTP配置 自定义日志文件 自定义验证器

一、自定义HTTP配置

package main

import (
"net/http" // 导入 net/http 包以使用 HTTP 相关功能
"time"     // 导入 time 包以处理时间相关功能

"github.com/gin-gonic/gin" // 导入 Gin 框架
)

func main() {
router := gin.Default() // 创建一个默认的 Gin 引擎实例

// 定义一个简单的 GET 路由,返回一个欢迎消息
router.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Welcome to the custom HTTP server!") // 返回 200 状态码和消息
})

// 创建一个自定义的 HTTP 服务器配置
s := &http.Server{
Addr:           ":8080",          // 设置服务器监听的地址和端口,这里是 8080
Handler:        router,           // 设置请求处理程序为 Gin 路由
ReadTimeout:    10 * time.Second, // 设置读取请求的超时时间为 10 秒
WriteTimeout:   10 * time.Second, // 设置写入响应的超时时间为 10 秒
MaxHeaderBytes: 1 << 20,          // 设置请求头的最大字节数,这里设置为 1MB
}

// 启动 HTTP 服务器,并监听传入的请求
// 如果服务器启动失败,将返回错误
s.ListenAndServe() // 启动服务器,开始监听和处理请求
}

由于这里配置的是服务器超时响应,所以效果和一般的GET请求是一样的,读者只需看懂代码里怎么自定义配置即可。

二、自定义日志文件

package main

import (
"fmt"  // 导入 fmt 包以格式化输出
"time" // 导入 time 包以处理时间相关功能

"github.com/gin-gonic/gin" // 导入 Gin 框架
)

func main() {
// 创建一个新的 Gin 引擎实例,使用 gin.New() 方法来创建一个不包含任何默认中间件的实例
router := gin.New()

// LoggerWithFormatter 中间件会写入日志到 gin.DefaultWriter
// 默认 gin.DefaultWriter = os.Stdout
// 下面定义一个自定义的日志格式化函数
router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
// 自定义日志格式
return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
// 客户端 IP 地址
param.ClientIP,
// 请求时间戳,使用 RFC1123 格式
param.TimeStamp.Format(time.RFC1123),
// 请求方法 (GET, POST 等)
param.Method,
// 请求路径
param.Path,
// 请求协议
param.Request.Proto,
// 响应状态码
param.StatusCode,
// 请求延迟时间
param.Latency,
// 用户代理
param.Request.UserAgent(),
// 错误信息(如果有的话)
param.ErrorMessage,
)
}))

// 使用 Recovery 中间件,处理任何出现的错误,并防止服务崩溃
router.Use(gin.Recovery())

// 定义一个简单的 GET 路由,当访问 /ping 时触发该处理函数
router.GET("/ping", func(c *gin.Context) {
// 返回 200 状态码和消息 "pong"
c.String(200, "pong")
})

// 启动 HTTP 服务器,监听在 8080 端口
router.Run(":8080")
}

效果
在这里插入图片描述

三、自定义验证器

package main

import (
"net/http" // 导入 HTTP 包以使用 HTTP 相关功能
// 导入反射包以处理反射操作
"time" // 导入时间包以处理时间相关功能

"github.com/gin-gonic/gin"               // 导入 Gin 框架
"github.com/gin-gonic/gin/binding"       // 导入 Gin 的绑定功能
"github.com/go-playground/validator/v10" // 导入 Go Playground 的验证器
)

// Booking 包含绑定和验证的数据。
// CheckIn 和 CheckOut 分别表示入住和退房日期。
type Booking struct {
CheckIn  time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"`                  // 入住日期,必须填写且可预订
CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn,bookabledate" time_format:"2006-01-02"` // 退房日期,必须填写且大于入住日期
}

// 自定义验证器:bookableDate
// 验证日期是否在当前日期之后。
var bookableDate validator.Func = func(fl validator.FieldLevel) bool {
date, ok := fl.Field().Interface().(time.Time) // 获取当前字段的值并转换为 time.Time 类型
if ok {
today := time.Now()    // 获取当前时间
if today.After(date) { // 如果今天的日期在输入日期之后,则返回 false
return false
}
}
return true // 日期有效,返回 true
}

func main() {
route := gin.Default() // 创建一个新的 Gin 引擎实例

// 注册自定义验证器
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
v.RegisterValidation("bookabledate", bookableDate) // 注册名为 "bookabledate" 的自定义验证器
}

// 定义一个 GET 路由,当访问 /bookable 时触发该处理函数
route.GET("/bookable", getBookable)

// 启动 HTTP 服务器,监听在 8085 端口
route.Run(":8085")
}

// getBookable 处理 /bookable 路由的请求
func getBookable(c *gin.Context) {
var b Booking // 创建 Booking 类型的变量 b
// 绑定请求数据到变量 b,并进行验证
if err := c.ShouldBindWith(&b, binding.Query); err == nil {
c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) // 返回有效的消息
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) // 返回错误信息
}
}

在浏览器中访问

http://localhost:8085/bookable?check_in=2024-10-20&check_out=2024-10-25 

进行有效日期的测试,确保入住日期在当前日期之后且退房日期大于入住日期。
在浏览器中访问

 http://localhost:8085/bookable?check_in=2023-10-10&check_out=2023-10-12 

测试无效日期,确保入住日期早于当前日期。
如果请求有效,你应该看到响应 {“message”: “Booking dates are valid!”};如果请求无效,则会看到相应的错误消息。
在这里插入图片描述


原文地址:https://blog.csdn.net/weixin_54259326/article/details/142969468

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!