gin: 路由文件配置404和异常处理
一,代码:
1,routes/route.go
package routes
import (
"fmt"
"github.com/gin-gonic/gin"
"imagebank/controller"
"imagebank/global"
"runtime/debug"
"time"
)
func Routes() *gin.Engine {
router := gin.Default()
//router.Use(gin.Recovery())
//处理找不到路由
router.NoRoute(HandleNotFound)
router.NoMethod(HandleNotFound)
//处理发生异常
router.Use(Recover)
//image
image := controller.NewImageController()
imageGroup := router.Group("/image")
{
imageGroup.GET("/detail", image.Detail)
imageGroup.GET("/list", image.List)
imageGroup.POST("/add", image.Add)
}
//访问根目录
router.GET("/", image.List)
return router
}
//404,找不到路径时的处理
func HandleNotFound(c *gin.Context) {
fmt.Println("请求的地址未找到,uri: ", c.Request.RequestURI)
fmt.Println("stack: ", string(debug.Stack()))
global.NewResult(c).ErrorCode(404,"资源未找到",nil)
return
}
//500,内部发生异常时的处理
func Recover(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
//打印错误堆栈信息
timeStr := time.Now().Format("2006-01-02 15:04:05")
fmt.Println("当前时间:", timeStr)
fmt.Println("当前访问path:", c.FullPath())
fmt.Println("当前完整地址:", c.Request.URL.String())
fmt.Println("当前协议:", c.Request.Proto)
fmt.Println("当前get参数:",global.GetAllGetParams(c))
fmt.Println("当前post参数:",global.GetAllPostParams(c))
fmt.Println("当前访问方法:", c.Request.Method)
fmt.Println("当前访问Host:", c.Request.Host)
fmt.Println("当前IP:",c.ClientIP())
fmt.Println("当前浏览器:",c.Request.UserAgent())
fmt.Println("发生异常:", err)
//global.Logger.Errorf("stack: %v",string(debug.Stack()))
debug.PrintStack()
//return
global.NewResult(c).ErrorCode(500,"服务器内部错误",nil)
}
}()
//继续后续接口调用
c.Next()
}
2,global/result.go
package global
import (
"github.com/gin-gonic/gin"
"net/http"
)
//返回的结果的内容:
type ResultCont struct {
Status string `json:"status"` //提示状态
Code int `json:"code"` //提示代码
Msg string `json:"msg"` //提示信息
Data interface{} `json:"data"` //出错
}
//放回结果
type Result struct {
Ctx *gin.Context
}
//生成result
func NewResult(ctx *gin.Context) *Result {
return &Result{Ctx: ctx}
}
//成功
func (r *Result) Success(data interface{}) {
if (data == nil) {
data = gin.H{}
}
res := ResultCont{}
res.Status="success"
res.Code = 0
res.Msg = ""
res.Data = data
r.Ctx.JSON(http.StatusOK,res)
r.Ctx.Abort()
}
//出错,接受code和msg
func (r *Result)ErrorCode(code int,msg string,data interface{}) {
if (data == nil) {
data = gin.H{}
}
res := ResultCont{}
res.Status="failed"
res.Code = code
res.Msg = msg
res.Data = data
r.Ctx.JSON(http.StatusOK,res)
r.Ctx.Abort()
}
3,global/global_function.go
package global
import (
"github.com/gin-gonic/gin"
"strings"
)
//得到所有get参数
func GetAllGetParams(c *gin.Context) (string) {
params := c.Request.URL.Query()
resStr := ""
// 遍历并打印所有参数及其值
for key, values := range params {
for _, value := range values {
resStr = resStr+"key:"+key+",value:"+value+"\n"
}
}
return resStr
}
//得到所有post参数
func GetAllPostParams(c *gin.Context) (string) {
c.Request.ParseMultipartForm(32 << 20)
resStr := ""
for k, v := range c.Request.PostForm {
resStr = resStr+"key:"+k+",value:"+strings.Join(v, ",")+"\n"
}
return resStr
}
4,main.go
package main
import (
"imagebank/routes"
)
// 入口函数
func main() {
//引入路由
r := routes.Routes()
//run
r.Run(":8080")
}
5,controller/ImageController.go
package controller
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
type ImageController struct{}
func NewImageController() ImageController {
return ImageController{}
}
//添加一条
func (ic *ImageController) Add(c *gin.Context) {
divide:=0
res:=100/divide
fmt.Println(res)
c.JSON(http.StatusOK, gin.H{
"message": "image detail",
})
}
//得到详情
func (ic *ImageController) Detail(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "image detail",
})
}
//得到列表
func (ic *ImageController) List(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "image list",
})
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗