gin框架

news2024/12/23 20:19:28

【狂神说】Gin框架一小时上手 | 快速转型GoWeb开发 | Go语言零基础教程_哔哩哔哩_bilibili

1.介绍

2.简单程序

1)gin.GET/POST/PUT/DELETE函数

Go Gin 简明教程 | 快速入门 | 极客兔兔 (geektutu.com)

我的理解是:这类函数就像是在监听接口一样,执行后一直在等待,没有捕捉到对应参数就没任何影响,捕捉到了就调用其对应的执行函数。

2)gin.Context

代表上下文信息,是一个结构体,一般用来处理Http请求和响应

Gin源码分析系列之Context篇 - 知乎 (zhihu.com)

20210814学习牛逼的gin.Context - 知乎 (zhihu.com)

3)context.JSON

给前端响应一个JSON信息

4)ginServer.Use(favicon.New("./day.ico")) 

给页面标签加一个ico

5)restful api

6)http状态码

const (
	StatusContinue           = 100 // RFC 9110, 15.2.1
	StatusSwitchingProtocols = 101 // RFC 9110, 15.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1
	StatusEarlyHints         = 103 // RFC 8297

	StatusOK                   = 200 // RFC 9110, 15.3.1
	StatusCreated              = 201 // RFC 9110, 15.3.2
	StatusAccepted             = 202 // RFC 9110, 15.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 9110, 15.3.4
	StatusNoContent            = 204 // RFC 9110, 15.3.5
	StatusResetContent         = 205 // RFC 9110, 15.3.6
	StatusPartialContent       = 206 // RFC 9110, 15.3.7
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices   = 300 // RFC 9110, 15.4.1
	StatusMovedPermanently  = 301 // RFC 9110, 15.4.2
	StatusFound             = 302 // RFC 9110, 15.4.3
	StatusSeeOther          = 303 // RFC 9110, 15.4.4
	StatusNotModified       = 304 // RFC 9110, 15.4.5
	StatusUseProxy          = 305 // RFC 9110, 15.4.6
	_                       = 306 // RFC 9110, 15.4.7 (Unused)
	StatusTemporaryRedirect = 307 // RFC 9110, 15.4.8
	StatusPermanentRedirect = 308 // RFC 9110, 15.4.9

	StatusBadRequest                   = 400 // RFC 9110, 15.5.1
	StatusUnauthorized                 = 401 // RFC 9110, 15.5.2
	StatusPaymentRequired              = 402 // RFC 9110, 15.5.3
	StatusForbidden                    = 403 // RFC 9110, 15.5.4
	StatusNotFound                     = 404 // RFC 9110, 15.5.5
	StatusMethodNotAllowed             = 405 // RFC 9110, 15.5.6
	StatusNotAcceptable                = 406 // RFC 9110, 15.5.7
	StatusProxyAuthRequired            = 407 // RFC 9110, 15.5.8
	StatusRequestTimeout               = 408 // RFC 9110, 15.5.9
	StatusConflict                     = 409 // RFC 9110, 15.5.10
	StatusGone                         = 410 // RFC 9110, 15.5.11
	StatusLengthRequired               = 411 // RFC 9110, 15.5.12
	StatusPreconditionFailed           = 412 // RFC 9110, 15.5.13
	StatusRequestEntityTooLarge        = 413 // RFC 9110, 15.5.14
	StatusRequestURITooLong            = 414 // RFC 9110, 15.5.15
	StatusUnsupportedMediaType         = 415 // RFC 9110, 15.5.16
	StatusRequestedRangeNotSatisfiable = 416 // RFC 9110, 15.5.17
	StatusExpectationFailed            = 417 // RFC 9110, 15.5.18
	StatusTeapot                       = 418 // RFC 9110, 15.5.19 (Unused)
	StatusMisdirectedRequest           = 421 // RFC 9110, 15.5.20
	StatusUnprocessableEntity          = 422 // RFC 9110, 15.5.21
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusTooEarly                     = 425 // RFC 8470, 5.2.
	StatusUpgradeRequired              = 426 // RFC 9110, 15.5.22
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 9110, 15.6.1
	StatusNotImplemented                = 501 // RFC 9110, 15.6.2
	StatusBadGateway                    = 502 // RFC 9110, 15.6.3
	StatusServiceUnavailable            = 503 // RFC 9110, 15.6.4
	StatusGatewayTimeout                = 504 // RFC 9110, 15.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 9110, 15.6.6
	StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
	StatusInsufficientStorage           = 507 // RFC 4918, 11.5
	StatusLoopDetected                  = 508 // RFC 5842, 7.2
	StatusNotExtended                   = 510 // RFC 2774, 7
	StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

3.给前端响应

发送请求和响应

给前端发送json和页面(静态资源)

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon
	//连接数据库之类,之后可以作为一个接口就可以给前端返回数据

	// //2.访问地址,处理我们的请求Request Response
	// //发送一个GET请求,如果url有hello,会执行后面的函数给前端返回信息
	// ginServer.GET("/hello", func(context *gin.Context) {
	// 	context.JSON(200, gin.H{"msg": "helloworld"})
	// })
	// ginServer.POST("/user", func(c *gin.Context) {
	// 	//返回json数据,状态码200就是http.StatusOK
	// 	c.JSON(200, gin.H{"msg": "post,user"})
	// })
	// ginServer.PUT("/user")
	// ginServer.DELETE("/user")

	//3.响应页面给前端
	//加载静态页面
	ginServer.LoadHTMLGlob("templates/*")
	//ginServer.LoadHTMLFiles("templates/index.html") //加载单个

	//4.加载资源文件(资源文件位置,根目录位置)
	ginServer.Static("/static", "./static")

	ginServer.GET("/index", func(c *gin.Context) {
		//返回页面
		c.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "这是go后台传递来的数据...",
		})
	})

	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}

4.获取请求中的参数

1)前端表单

package main

import (
	"encoding/json"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon
	//连接数据库之类,之后可以作为一个接口就可以给前端返回数据

	//3.响应页面给前端
	//加载静态页面
	ginServer.LoadHTMLGlob("templates/*")
	//ginServer.LoadHTMLFiles("templates/index.html") //加载单个

	//4.加载资源文件(资源文件位置,根目录位置)
	ginServer.Static("/static", "./static")

	ginServer.GET("/index", func(c *gin.Context) {
		//返回页面
		c.HTML(http.StatusOK, "index.html", gin.H{
			"msg": "这是go后台传递来的数据...",
		})
	})
	

	//7.获取前端表单数据
	ginServer.POST("/user/add", func(c *gin.Context) {
		//拿到数据
		username := c.PostForm("username")
		password := c.PostForm("password")
		//数据校验
		// if username == {
		// }

		//给前端返回数据
		c.JSON(http.StatusOK, gin.H{
			"msg":      "Ok",
			"password": password,
			"username": username,
		})
	})

	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}

 2)前端给后端传json

package main

import (
	"encoding/json"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon

	//前端给后端传json
	ginServer.POST("/json", func(c *gin.Context) {
		//request.body
		data, _ := c.GetRawData()  //从请求体获取数据
		var m map[string]interface{}
		_ = json.Unmarshal(data, &m) //解析后端接收的json
		//给前端发送回去
		c.JSON(http.StatusOK,m)

	})

	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}

3)?&传参

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon

	//?传参
	// url输入 /user/info?userid=xxx&username=kuangshen
	ginServer.GET("/user/info", func(c *gin.Context) {
		userid := c.Query("userid") //接收前端问号传参的值
		username := c.Query("username")
		//返回json数据,状态码200就是http.StatusOK
		c.JSON(http.StatusOK, gin.H{
			"userid":   userid,
			"username": username,
		})
	})


	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}

4)RESTful风格传参

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

/*
固定格式:请求,处理请求函数
ginServer.POST("/user", func(c *gin.Context) {
})
*/
func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon


	//RESTful风格传参,冒号后自动接收参数
	//url输入 /user/info/1/ kuangshen
	ginServer.GET("/user/info/:userid/:username", func(c *gin.Context) {
		userid := c.Param("userid")
		username := c.Param("username")
		//返回json数据,状态码200就是http.StatusOK
		c.JSON(http.StatusOK, gin.H{
			"userid":   userid,
			"username": username,
		})
	})



	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}

5.路由,重定向

1)普通路由

该案例自动跳转必应

// 路由
func route(ginServer *gin.Engine) {
	ginServer.GET("test", func(context *gin.Context) {
		//重定向状态301
		context.Redirect(http.StatusMovedPermanently, "https://www.bing.com")
	})
}

2).404

只要输入的访问路径不被已知的请求处理,那么就是404状态,会被该请求捕获并跳转到404.

404页面需要提前加载一下静态资源

// 404页面
func noRoute(ginServer *gin.Engine) {
	ginServer.NoRoute(func(context *gin.Context) {
		context.HTML(http.StatusNotFound, "404.html", nil) //会从指定的静态资源路径下去找
	})

3)路由组

对一个路径下的不同分路径请求进行处理

// 路由组,相当于对一个路径下不同分路径一起做处理
func routeGroup(ginServer *gin.Engine) {
	userGroup := ginServer.Group("/user")
	{
		userGroup.GET("/add")
		userGroup.GET("/login")
		userGroup.GET("/logout")
	}
	orderGroup := ginServer.Group("/order")
	{
		orderGroup.GET("/add")
		orderGroup.GET("/delete")
	}

}

6.拦截器

1)自定义中间件

流程:定义,注册,指定(可有可无)

注册中间件之后默认给所有请求使用,如果在某个请求里指定了,就只给这一个请求使用。

package main

import (
	"encoding/json"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/thinkerou/favicon"
)

// 自定义go中间件拦截器
func myHandler() gin.HandlerFunc {
	return func(context *gin.Context) {
		//自定义中间件设置的值,在后续处理只要调用了这个中间件的都可以拿到这里的参数
		context.Set("usersession", "userid-1")
		if true { //放行
			context.Next()
		} else { //阻止
			context.Abort()
		}
	}
}

// 使用自定义中间件
func handler(ginServer *gin.Engine) {

	//这样请求被方法接收之前会先被中间件拦截处理,如果通过,才会被方法接收处理
	//?传参
	// url输入 /user/info2?userid=xxx&username=kuangshen
	ginServer.GET("/user/info2",myHandler(), func(c *gin.Context) {
		//取出中间件的值
		usersession := c.MustGet("usersession").(string)
		log.Println(usersession)    //后台打印
		userid := c.Query("userid") //接收前端问号传参的值
		username := c.Query("username")
		c.JSON(http.StatusOK, gin.H{
			"userid":   userid,
			"username": username,
		})
	})
}

func main() {
	//·1.创建一个服务
	ginServer := gin.Default()
    //注册中间件
	ginServer.Use(myHandler())
	ginServer.Use(favicon.New("./day.ico")) //加网站小icon
	//连接数据库之类,之后可以作为一个接口就可以给前端返回数据

	//使用自定义中间件
	handler(ginServer)

	//服务器端口,给一个服务端口,默认8080
	ginServer.Run(":8080") //一定有个冒号
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解搜索引擎优化(SEO)

深入理解搜索引擎优化 深入理解搜索引擎优化(SEO)1、SEO基础入门SEO概述搜索引擎营销策略SEO查询工具与站长平台收录与权重 2、SEO站内优化关键词域名、主机、程序与SEO设计技巧及优化标签优化技巧(TDK)页面关键词的布局和密度网站内部优化与代码优化301重定向,404优…

文件读取漏洞复现(Metinfo 6.0.0)

安装环境 安装phpstudy,下载MetInfo 6.0.0版本软件,复制到phpstudy目录下的www目录中。 打开phpstudy,访问浏览器127.0.0.1/MetInfo6.0.0/install/index.php,打开Meinfo 6.0.0主页: 点击下一步、下一步&#xff0c…

stencilJs学习之构建 Drawer 组件

前言 在之前的学习中,我们已经掌握了 stencilJs 中的一些核心概念和基础知识,如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础,而抽屉组件是一个很好的示例,能够…

温室气体数据记录软件

温室气体数据记录软件用于记录温室气体分析仪、冷阱系统、阀箱以及采样单元数据的获取及记录。其软件界面如下: 在软件操作几面上部是工具栏,可以实现软件的各种操作,工具栏的排布如下所示: 最左侧为“连接”工具,用…

Android 蓝牙开发( 四 )

前言 上一篇文章给大家分享了Kotlin版的Android蓝牙的基础知识和基础用法,不过上一篇都是一些零散碎片化的程序,,这一篇给大家分享Android蓝牙开发实战项目KotlinCompose的初步使用 效果演示 : Android Compose 蓝牙开发 Android蓝牙实战开发…

upload-labs靶场通关详解

文章目录 Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16Pass-17Pass-18Pass-19Pass-20方法一(文件夹名欺骗绕过)方法二(%00截断攻击) Pass-21 Pass-01 绕过…

Vert.x 源码解析(4.x)(一)——Context源码解析

目录 1.简介 Vert.x 中,多线程环境下的资源管理和状态维护是一个复杂的问题。为了解决这个问题,Vert.x 引入了 Context 这个核心概念。Context 负责在多线程环境下协调异步操作,提供线程安全的资源访问,并确保异步操作的正确执行…

Spring MVC工作流程

SpringMVC 的执行流程如下。 用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handl…

LinuxUbuntu安装OpenWAF

Linux&Ubuntu安装OpenWAF 官方GitHub地址 介绍 OpenWAF(Web Application Firewall)是一个开源的Web应用防火墙,用于保护Web应用程序免受各种网络攻击。它通过与Web服务器集成,监控和过滤对Web应用程序的流量,识…

基于移动端的校园失物招领系统 微信小程序的设计与实现779m5

于校园失物招领系统功能所牵扯的数据都是通过失主进行校园失物招领系统等相关的数据信息内容、并且可以实现首页、个人中心、失主管理、物品类型管理、失物展示管理、失物认领管理、在线投诉管理、论坛交流、系统管理等功能可以通过系统进行分配,传统的手工作业模式…

WebDAV之π-Disk派盘 + notototo

notototo是一款功能丰富的笔记软件,提供了多种功能,包括载入PDF文件并进行批注和标记的能力。您可以使用Apple Pencil或手指在PDF文件上进行写作和绘图操作。 同时,notototo也提供了与团队合作的功能,您可以连接到服务器并与他人协作。此外,您还可以在notototo中进行绘图,…

Dolphin for Mac(Wii游戏模拟器)配置指南

Wii模拟器Dolphin Mac是款适合Mac电脑中的游戏玩家们使用的模拟器工具。Wii模拟器Dolphin Mac官方版支持直接运行游戏镜像文件,玩家可以将游戏ISO拷贝到某一个文件夹中统一进行管理。Wii模拟器Dolphin Mac除了键盘和鼠标外,还支持配合原版的Wii遥控器操作…

MySQL告警“Connection attributes of length 570 were truncated“

mysql的错误日志中看到如下报错"[Warning] Connection attributes of length 571 were truncated"。比如: 2023-09-01T08:37:49.87392408:00 9149015 [Warning] [MY-010288] [Server] Connection attributes of length 570 were truncated (76 bytes los…

ip route get ip地址 应用案例

应用场景 在做虚拟化实验用的虚拟机和实际的ECS云主机一般都会有多个网卡,网络的联通性是经常碰到的问题。比如在一个VM上有3个网卡,分别为ens160(和寄主机进行桥接的网卡10.0.0.128)、ens224(连接仅主机网络10.0.0.0/24的网卡10.0.0.128&…

三维模型OBJ格式轻量化顶点压缩主要技术方法分析

三维模型OBJ格式轻量化顶点压缩主要技术方法分析 三维模型的OBJ格式轻量化中,顶点压缩是一项重要的技术方法,用于减小模型文件的大小。以下是关于三维模型OBJ格式轻量化顶点压缩的主要技术方法的分析: 1、顶点位置量化: 顶点位置…

直播平台源码弹性云托管技术:稳定直播与降低成本的利器

在当今的互联网时代,直播平台源码层出不穷,直播平台源码不仅可以让人们获取最新的资讯、查找资料等信息获取,还能让人们在其中观看短视频、直播、与其他人聊天等互动放松,直播平台源码的受欢迎与平台人数的增加使得人们在选择直播…

Python爬虫(十七)_糗事百科案例

糗事百科实例 爬取糗事百科段子,假设页面的URL是: http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath/re做数据提取获取每个帖子里的用户头像连接、用户姓名、段子内容、点赞次数和评论次数保存到json文件内…

使用spring自带的发布订阅机制来实现消息发布订阅

背景 公司的项目以前代码里面有存在使用spring自带发布订阅的代码,因此稍微学习一下如何使用,并了解一下这种实现方式的优缺点。 优点 实现方便,代码方面基本只需要定义消息体和消费者,适用于小型应用程序。不依赖外部中间件&a…

JavaScript设计模式(二)——简单工厂模式、抽象工厂模式、建造者模式

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

pdfh5在线预览pdf文件

前言 pc浏览器和ios的浏览器都可以直接在线显示pdf文件&#xff0c;但是android浏览器不能在线预览pdf文件&#xff0c;如何预览pdf文件&#xff1f; Github: https://github.com/gjTool/pdfh5 Gitee: https://gitee.com/gjTool/pdfh5 使用pdfh5预览pdf 编写预览页面 <…