首页 > 其他分享 >gin 路由处理&控制器

gin 路由处理&控制器

时间:2024-02-26 18:11:23浏览次数:25  
标签:控制器 http context func router gin 路由

获取请求传参

获取get请求传参
Query和DefaultQuery
	router := gin.Default()

	// 127.0.0.1:8080/index?page=1&category=2
	router.GET("/index", func(context *gin.Context) {
		// 通过Query获取get请求url传入的参数
		page := context.Query("page")
		// 通过DefaultQuery获取url传入的参数,如果能获取到key对应的值,则使用该值,否则使用传入的默认值1
		category := context.DefaultQuery("category", "1")
		// 返回值 {"category": "2", "page": "1" }
		context.JSON(http.StatusOK, gin.H{"page": page, "category": category})

	})

	router.Run()
动态路由传值
func main() {
	router := gin.Default()

	// 动态路由传值,通过:字段的方式,
	router.GET("/list/:id", func(context *gin.Context) {
		// 获取到url传入的值
		id := context.Param("id")
		context.JSON(http.StatusOK, gin.H{"id": id})

	})

	router.Run()

}
获取post请求传参
获取POST数据
	router.POST("/user", func(context *gin.Context) {
		// PostForm 获取表单传值,如果没有传,则是空
		username := context.PostForm("username")
		// DefaultPostForm 获取表单传值,如果能获取到,则用该值,否则使用传入的默认值
		nickname := context.DefaultPostForm("nickname", "小明")
		context.JSON(http.StatusOK, gin.H{"username": username, "nickname": nickname})
	})
获取Post Xml数据

如果用到 JSON 或 XML 来作为数据交互的格式, 可以在 gin 中使用 c.GetRawData()获取数据

import (
	"encoding/xml"
	"github.com/gin-gonic/gin"
	"net/http"
)

type UserInfo struct {
	UserName string `xml:"username" json:"user"`
	NickName string `xml:"nickname" json:"nickname"`
}

func main() {
	router := gin.Default()

	router.POST("/getUer", func(context *gin.Context) {
		user := &UserInfo{}

		// 返回一个byte类型的切片和一个error
		sliceByte, _ := context.GetRawData() // GetRawData 获取context.Request.Body 读取请求数据

		//Unmarshal作用是将xml数据解析为结构体,第一个参数是包含xml数据的字节数组,第二个是要解析为的目标结构体
		// Unmarshal返回一个error
		if err := xml.Unmarshal(sliceByte, &user); err == nil {
			context.JSON(http.StatusOK, user)

		} else {
			// 返回值400错误码,err.Error是具体错误
			context.JSON(http.StatusBadRequest, gin.H{"err": err.Error()})
		}

	})
	router.Run()

}
传值绑定到结构体

我们可以基于请求的 Content-Type 识别请求数据类型并利用反射机制自动提取请求中 QueryString、form 表单、JSON、XML 等参数到结构体中。 .ShouldBind()能够基于请求自动提取 JSON、form 表单和 QueryString 类型的数据,并把值绑定到指定的结构体对象

// 结构体
type UserInfo struct {
	UserName string `form:"username" json:"user"`
	NickName string `form:"nickname" json:"nickname"`
}
	router.GET("/getUser", func(context *gin.Context) {
		// 初始化结构体
		user := &UserInfo{}
		// ShouldBind接收一个指针地址,返回值是一个error
		// 判断err == nil 说明没有error
   
		if err := context.ShouldBind(&user); err == nil {
			context.JSON(http.StatusOK, user)

		} else {
			context.JSON(http.StatusOK, gin.H{"error": err})
		}

	})

路由分组

简单分组
func main() {
	router := gin.Default()

	// 创建路由组
	defaultRouters := router.Group("/")
	{   // 访问路径是 /index
		defaultRouters.GET("/index", func(context *gin.Context) {
			context.String(http.StatusOK, "ok")

		})
	}

	// 创建路由组

	apiRouters := router.Group("api")
	{
		// 访问路径= api/list,
		apiRouters.GET("/list", func(context *gin.Context) {
			context.String(http.StatusOK, "ok")

		})
	}

	router.Run()

}

文件分组路由
  1. 创建其他路由文件
package api

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// router *gin.Engine :main中创建的默认引擎
func ApiRoutersInit(router *gin.Engine) {
	// 创建路由组
	apiRouter := router.Group("api")
	{
		//  api/list
		apiRouter.GET("list", func(context *gin.Context) {
			context.String(http.StatusOK, "ok")
		})
	}

}

  1. 在主路由调用并传入默认路由引擎

    package main
    
    import (
    	"github.com/gin-gonic/gin"
      // 其他路由所在的包
    	"golang_7/api"
    )
    
    func main() {
    	// 默认引擎
    	router := gin.Default()
    	// 调用其他文件定义的接收引擎的方法
    	api.ApiRoutersInit(router)
    	router.Run()
    
    }
    
    

控制器

路由分组中还需要处理对应的业务逻辑,控制器是用于处理请求的代码块或函数,它负责接收请求,处理请求中的数据并生成响应。控制器通常与路由关联,路由将请求分发给相应的控制器进行处理,两者配合可以路由只是处理路由,控制器来处理逻辑,业务抽离

业务推荐写法:路由分发交给路由处理,业务逻辑控制器处理

控制器分组
控制器方法
// 自定义apicontrollers包
package apicontrollers

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func ApiGetInfo(context *gin.Context) {
	context.String(http.StatusOK, "ok")

}


在路由中注册控制器方法
package api

import (
	"github.com/gin-gonic/gin"
	// 引入apicontrollers包

	apicontrollers "golang_7/controllers/api"
)

// router *gin.Engine :main中创建的默认引擎
func ApiRoutersInit(router *gin.Engine) {

	apiRouter := router.Group("api")
	{
		// 通过controllers包 引入 ApiGetInfo方法,ApiGetInfo不能+(), 有()是调用方法,没()是注册方法
		apiRouter.GET("list", apicontrollers.ApiGetInfo)

	}
}

控制器继承
把控制器方法改造成结构体
package apicontrollers

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// 定义结构体
type ApiController struct {
}

// 定义结构体方法控制器
func (a ApiController) ApiGetInfo(context *gin.Context) {
	context.String(http.StatusOK, "ok")
}

// 定义结构体方法控制器
func (a ApiController) ApiSetInfo(context *gin.Context) {
	context.String(http.StatusOK, "ok")
}

使用结构体调用方法
package api

import (
	"github.com/gin-gonic/gin"
	// 引入apicontrollers包

	apicontrollers "golang_7/controllers/api"
)

// router *gin.Engine :main中创建的默认引擎
func ApiRoutersInit(router *gin.Engine) {

	apiRouter := router.Group("api")
	{ 
    // apicontrollers包的ApiController结构体的ApiGetInfo方法
		apiRouter.GET("list", apicontrollers.ApiController{}.ApiGetInfo)

	}
}

控制器继承

父类控制器

package apicontrollers

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// 定义一个base结构体
type BaseController struct {
}

// 定义 结构体方法-请求成功
func (b BaseController) success(ctx *gin.Context) {
	ctx.String(http.StatusOK, "ok")

}

// 定义 结构体方法-请求失败
func (b BaseController) error(ctx *gin.Context) {
	ctx.String(http.StatusBadRequest, "error")

}

子类控制器

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

// 定义结构体
type ApiController struct {
	// 嵌套BaseControll结构体
	BaseController BaseController
}

// 定义结构体方法控制器
func (a ApiController) ApiGetInfo(context *gin.Context) {
	// 调用嵌套继承的BaseController的success方法
	a.BaseController.success(context)
}

// 定义结构体方法控制器
func (a ApiController) ApiSetInfo(context *gin.Context) {
	context.String(http.StatusOK, "ok")
}

标签:控制器,http,context,func,router,gin,路由
From: https://www.cnblogs.com/Mickey-7/p/18034896

相关文章

  • 用路由方式写一个通用的微信小程序校验文件验证
    微信小程序加业务域名时,为了安全,通常需要在所在业务域名的根目录下加小程序校验文件,这个校验文件时txt格式,如果接入的小程序过多,需要多次上传。观察校验文件里的内容和校验文件名称是有一定关系的,我们可以通过路由方式,不管今后有多少小程序接入,都不需要传校验文件。下面是ThinkPHP......
  • yum nginx报错
    [root@instance-as0nsoaxnginx]#yum-yinstallgdgd-develerror:db5error(11)fromdbenv->open:Resourcetemporarilyunavailableerror:cannotopenPackagesindexusingdb5-Resourcetemporarilyunavailable(11)error:cannotopenPackagesdatabasein......
  • gin环境&路由配置
    Gin是一个Go(Golang)编写的轻量级httpweb框架,运行速度非常快Gin的官网:https://gin-gonic.com/zh-cn/GinGithub地址:https://github.com/gin-gonic/gingin环境搭建下载并安装#gomod同级目录下goget-ugithub.com/gin-gonic/gin......
  • AtCoder Beginner Contest 342
    D.SquarePair给你一个数组,最多2e5个元素,每个元素的范围是0到2e5问选出两个元素,乘积为完全平方数的情况有多少?(任选a[i]a[j],且满足i<j)一种思路是用map记录数组的元素,选出一个元素x后,枚举所有完全平方数,如果完全平方数可以整除选出的这个元素且整除的结果y在map......
  • Toyota Programming Contest 2024#2(AtCoder Beginner Contest 341)D - Only one of two
    目录链接题面题意题解代码总结链接D-Onlyoneoftwo题面题意求第\(k\)个只能被\(N\)或\(M\)整除的数题解\([1,x]\)中的能被\(n\)整除的数有\(\lfloor\frac{x}{n}\rfloor\)个\([1,x]\)中的能被\(m\)整除的数有\(\lfloor\frac{x}{m}\rfloor\)个\([1,x]\)中的能被\(n\)......
  • Nginx之概念
      服务器     服务器的概念分为两种:1主机 2运行程序容器 Nginx概述Nginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3/SMTP)代理服务器。 Nginx的特......
  • C# WPF Halcon HDevEngine混合编程
    C#WPFHalconHDevEngine混合编程WPF+Halcon引用halcondotnet.dll和hdevenginedotnet.dllXAML中导入命名空间xmlns:halcon=“clr-namespace:HalconDotNet;assembly=halcondotnet”。输入xmlns后,tab选择halcon,然后再tab就自动输入)WPF布局,创建HWindowControlWPF窗口2.HDevEn......
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)
    HUAWEIProgrammingContest2024(AtCoderBeginnerContest342)A-Yay!代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=p......
  • Android Studio 引入 OpenCV 之后 出现 Plugin was not found in any of the followin
    网上看了各种方法,什么设置代理啊,清缓存啊,重启啊之类的都试过了,都不行,后来看到帖子说OpenCV的包用的是Groovy的,即build.gradle文件而不是Kotlin的build.gradle.kts文件,然后我改了还是会报错后来我发现我遗漏了一个重点!!!要将项目根目录下的setting.gradl......
  • Atcoder Beginner Contest 342 全题解
    A-Yay!题意给定字符串\(s\)已知该字符串中只有一个字符与其他字符不同求这个字符思想开一个数组\(cnt_i\)来记录\(s\)中每个字符出现的次数,一个数组\(first_i\)来记录\(s\)中每个字符第一次出现的下标。选择\(cnt_i=1\)的\(i\)输出\(first_i\)......