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",
	})
}

 

二,访问测试

posted @   刘宏缔的架构森林  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示