Golang Gin HTTP 请求和参数解析

news2024/12/24 9:14:18

gin 网络请求与路由处理


我们介绍了Gin框架,并做了Gin框架的安装,完成了第一个Gin工程的创建。

创建Engine

在gin框架中,Engine被定义成为一个结构体,Engine代表gin框架的一个结构体定义,其中包含了路由组、中间件、页面渲染接口、框架配置设置等相关内容。默认的Engine可以通过gin.Default进行创建,或者使用gin.New()同样可以创建。两种方式如下所示:

engine1 := gin.Default()
engine2 := gin.New()

gin.Default()和gin.New()的区别在于gin.Default()也使用gin.New()创建engine实例,但是会默认使用Logger和Recovery中间件。

  • Logger是负责进行打印并输出日志的中间件,方便开发者进行程序调试
  • Recovery中间件的作用是如果程序执行过程中遇到panic中断了服务,则Recovery会恢复程序执行,并返回服务器500内部错误。通常情况下,我们使用默认的gin.Default创建Engine实例。

处理HTTP请求


在创建的engine实例中,包含很多方法可以直接处理不同类型的HTTP请求。

 

HTTP请求类型


http协议中一共定义了八种方法或者称之为类型来表明对请求网络资源(Request-URI)的不同的操作方式,分别是:OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。

虽然一共有八种请求操作类型,但是实际开发中常用的GET POST DELETE等几种。

get表示从网络上获取一种网络资源,post表示要向服务器提交一段数据,往往在使用的过程当中是在某个网页当中有一个表单数据提交的时候使用post。delete是在删除资源的时候执行。

 如果要携带数据,会放在body当中,这样会将携带数据的名称和相应的数据在这里面填入就行了。 

 

 

通用处理


engine中可以直接进行HTTP请求的处理,在ongine中使用Handle方法进行http请求的处理。Handle 方法包含三个参数,具体如下所示:

func (group *RouterGroup) Handle(httpMethod string, relativePath string, handlers ...HandlerFunc) IRoutes
  • httpMethod:第一个参数表示要处理的HTTP的请求类型,是GET、POST、DELETE等8种请求类型中的一种。
  • relativePath:第二个参数表示要解析的接口,由开发者进行定义。
  • handlers:第三个参数是处理对应的请求的代码的定义。CSDN@富士康质检员张全蛋

举例如下:

 handler处理GET请求

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

// 使用handle方法处理/hello这样一个请求
func main() {
	//创建engine引擎对象
	engine := gin.Default()
	//请求路径 http://localhost:8080/hello?name=lucas 带参数name
	//匿名函数处理http的请求,context为请求上下文,携带一些属性和方法
	engine.Handle("GET", "/hello", func(c *gin.Context) {
		path := c.FullPath() //请求的接口
		fmt.Println(path)

		//获取参数,最后一个参数是获取不到时候的默认值为hello
		name := c.DefaultQuery("name", "hello")
		fmt.Println(name)

		//输出,处理完请求之后需要返回结果给前端
		c.Writer.Write([]byte("hello " + name))

	})

	engine.Run(":8000")
}

/hello
lucas
[GIN] 2023/04/25 - 10:53:09 | 200 |       333.7µs |       127.0.0.1 | GET      "/hello?name=lucas"

/hello
hello
[GIN] 2023/04/25 - 10:54:11 | 200 |            0s |       127.0.0.1 | GET      "/hello"

通过Handle方法第一个参数指定处理GET类型的请求,解析的接口是/hello。

Context是gin框架中封装的一个结构体,这是gin框架中最重要,最基础的一个结构体对象。

该结构体可以提供我们操作请求,处理请求,获取数据等相关的操作,通常称之为上下文对象,简单说为我们提供操作环境。

可以通过context.Query和context.DefaultQuery获取GET请求携带的参数。可以通过context.Writer.Write向请求发起端返回数据。

handler处理post请求 

//post http://localhost:8080/login
	//post请求携带数据不和get上面一样,而是放在请求的body里面,也就是请求体里面
	engine.Handle("POST", "/login", func(c *gin.Context) {
		path := c.FullPath() //请求的接口
		fmt.Println(path)

		//获取post表单当中数据的哪一个字段
		username := c.PostForm("username")
		password := c.PostForm("password")
		fmt.Println("username:", username, "password:", password)

		c.Writer.Write([]byte("username:" + username))
	})

如上的案例,通过第一个参数指定了解析POST类型的请求,第二个参数指定解析的接口为/login。POST请求是以form表单的方式提交数据的,可以通过context.PostForm获取表单中提交的数据字段。

其他类型的HTTP请求也可以通过Handle方法处理对应类型的请求。

分类处理


除了engine中包含的通用的处理方法以外,engine还可以按类型进行直接解析。engine中包含有get 方法、post方法、delete方法等与http请求类型对应的方法。

engine.GET()处理GET请求

engine中包含GET方法处理HTTP的GET类型的请求。engine的GET方法包含两个参数,编程使用如下所示:

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

func main() {
	engine := gin.Default()
	//http://127.0.0.1/hello?name=lucas
	engine.GET("/hello", func(c *gin.Context) {
		fmt.Println(c.FullPath())

		//查询携带的字段名称,这个没有默认返回参数
		name := c.Query("name")
		fmt.Println("name:", name)

		c.Writer.Write([]byte("name is:" + name))
	})

	engine.Run()
}


[GIN-debug] Listening and serving HTTP on :8080
/hello
name: lucas
[GIN] 2023/04/26 - 09:06:37 | 200 |       297.4µs |       127.0.0.1 | GET      "/hello?name=lucas"

/hello
name:
[GIN] 2023/04/26 - 09:07:12 | 200 |       950.7µs |       127.0.0.1 | GET      "/hello?name1=lucas"
package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

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

	engine.POST("/login", func(c *gin.Context) {
		fmt.Println(c.FullPath())

		if name, exits := c.GetPostForm("username"); exits {
			fmt.Println("username is:", name)
		}

		if password, exits := c.GetPostForm("password"); exits {
			fmt.Println("password is:", password)
		}

	})

	engine.Run()
}


[GIN-debug] Listening and serving HTTP on :8080
/login
username is: lucas 
password is: 123456
[GIN] 2023/04/26 - 09:13:34 | 200 |      1.5881ms |       127.0.0.1 | POST     "/login"

 在解析接口的这个地方,通过:自定义变量的值,:id表示变量的值,

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
)

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

	engine.DELETE("/user/:id", func(c *gin.Context) {
		userID := c.Param("id")
		fmt.Println("userid is:", userID)
	})

	engine.Run()
}

[GIN-debug] Listening and serving HTTP on :8080
userid is: 24
[GIN] 2023/04/26 - 10:05:25 | 200 |            0s |       127.0.0.1 | DELETE   "/user/24"

 

上面介绍了最常用的两种http处理请求的方式,一种是使用handler处理,需要指定具体的请求类型,其次是路由的方法post delete这种进行响应接口类型的处理。

上面同时也介绍了如何获取客户端提交的数据。post get delete.............................。 

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

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

相关文章

26- OCR 基于PP-OCRv3的液晶屏读数识别

要点: 液晶屏识别示例github 地址 1. 简介 本项目基于PaddleOCR开源套件,以PP-OCRv3检测和识别模型为基础,针对液晶屏读数识别场景进行优化。主要是针对各种仪表进行识别: 2 安装环境 安装Git:Git 详细安装教程 # 首…

YOLOv8 Bug及解决方案汇总

Traceback (most recent call last): File “D:\Anaconda\Scripts\yolo-script.py”, line 33, in sys.exit(load_entry_point(‘ultralytics==8.0.83’, ‘console_scripts’, ‘yolo’)()) self.model, self.save = parse_model(deepcopy(self.yaml), ch=ch, verbose=verbos…

基于 Python 的 Meta AI —— SAM

Segment Anything Model(SAM)是 Facebook 的一个 AI 模型,旨在推广分割技术。在我们之前的文章中,我们讨论了 SAM 的一般信息,现在让我们深入了解其技术细节。SAM 模型的结构如下图所示,图像经过编码器得到…

【致敬未来的攻城狮计划】— 连续打卡第十三天:FSP固件库开发启动文件详解

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

《Spring MVC》 第八章 拦截器实现权限验证、异常处理

前言 Spring 提供了Interceptor 拦截器,可用于实现权限验证、异常处理等 1、拦截器 对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作 1.1、定义…

UGUI中点击判断的原理

首选需要理解 EventSystem 中的代码结构,EventSystem 目录下包含4个子文件夹,分别是 EventData、InputModules,Raycasters 和 UIElements,UIElements 下是 UI Toolkit 相关代码,这里不做研究,主要关注其他三…

linux文件及文件内容查找命令总结

在linux环境下,我们经常要查找一个文件或者文件的内容,但搜索的命令有很多,这些命令都有什么区别,应该怎么选择和使用呢? 下面总结了一些常见的文件查找、内容查找的命令,收藏起来备用吧。 文件查找 where…

每日学术速递4.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Long-Term Photometric Consistent Novel View Synthesis with Diffusion Models 标题:具有扩散模型的长期光度一致的新视图合成 作者:Jason J. Yu, Feresh…

Python入门教程+项目实战-11.3节: 元组的操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 知识要点 11.3.4 系统学习python 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型,抽象数据类型定义了数据类型的操作方法,在本节的内容中,着重介绍元组类型的操作方法…

hive udf, tried to access method org.bouncycastle.math.ec.ECPoint$AbstractFp

在hive中添加加密udf,测试报错: select encrypt_sm2("aa","04AD9356466C7A505B3B2E18F2484E1F096108FA19C0F61C707A808EDF7C132BC3CE33E63D2CC6D77FB0A172004F8F5282CEADE22ED9628A02FE8FD85AF1EFE8B3"); Error: Error while compiling statem…

从0搭建Vue3组件库(九):VitePress 搭建部署组件库文档

VitePress 搭建组件库文档 当我们组件库完成的时候,一个详细的使用文档是必不可少的。本篇文章将介绍如何使用 VitePress 快速搭建一个组件库文档站点并部署到GitHub上 安装 首先新建 site 文件夹,并执行pnpm init,然后安装vitepress和vue pnpm install -D vitepress vue安…

什么是分库分表?为什么需要分表?什么时候分库分表

不急于上手实战 ShardingSphere 框架,先来复习下分库分表的基础概念,技术名词大多晦涩难懂,不要死记硬背理解最重要,当你捅破那层窗户纸,发现其实它也就那么回事。 什么是分库分表 分库分表是在海量数据下&#xff0…

“星河杯”隐私计算大赛新闻发布会在京召开

4月24日下午,“星河杯”隐私计算大赛新闻发布会在京召开。本次大赛由中国信通院、中国通信学会、隐私计算联盟共同主办,中移动信息技术有限公司、联通数字科技有限公司、天翼电子商务有限公司、中国通信标准化协会大数据技术标准推进委员会联合协办&…

微信小程序 | 基于高德地图+ChatGPT实现旅游规划小程序

🎈🎈效果预览🎈🎈 ❤ 路劲规划 ❤ 功能总览 ❤ ChatGPT交互 一、需求背景 五一假期即即将到来,在大家都阳过之后,截止到目前这应该是最安全的一个假期。所以出去旅游想必是大多数人的选择。 然后&#x…

Activity中startForResult的原理分析

前言: 如果使用androidX支持库中的ComponentActivity,会推荐使用registerForActivityResult的方式。但是对于不支持androidX的项目,或者就是继承自Activity的页面来说,startActivityForResult仍然是唯一的选择。 如果想了解andr…

虹科教您 | 虹科RELY-TSN-KIT操作指南(3)——基于Linux系统进行TSN协议测试

随着技术的变革和实际生产业务需求的推动,工厂内部互联架构逐渐趋于扁平化(IT/OT融合),而TSN则是在这一背景下发展起来的新兴技术,旨在为以太网协议建立“通用”的时间敏感机制,以确保网络数据传输的时间确…

云计算服务安全评估办法

云计算服务安全评估办法 2019-07-22 14:46 来源: 网信办网站【字体:大 中 小】打印 国家互联网信息办公室 国家发展和改革委员会 工业和信息化部 财政部关于发布《云计算服务安全评估办法》的公告 2019年 第2号 为提高党政机关、关键信息基础设施运营者…

鸿蒙系统是什么?鸿蒙与开源鸿蒙的关系?鸿蒙系统的发展历程

鸿蒙OS分布式操作系统简介鸿蒙系统(HarmonyOS),是第一款基于微内核的全场景分布式OS,是华为自主研发的操作系统。现被华为捐献给开放原子基金会管理,为开放原子基金会下的一个项目。 从 系统定位 上来说,HarmonyOS是一…

explain都不懂?搞什么数据库优化,快进来学习了

文章目录 一、 前言二、MySQL EXPLAIN实战三、mysql EXPLAIN输出结果详解3.1 id详解3.2 select_type3.3 table3.4 partitions3.5 type3.6 possible_keys3.7key3.8 key_len3.9 ref3.10 rows3.11 filtered3.12 Extra 一、 前言 EXPLAIN 想必用过mysql的小伙伴都听过,…

PWM 呼吸灯实验

PWM 呼吸灯实验 FPGA实现一个PWM模块(硬件)来控制灯的亮灭。 实验原理 PWM本质上就是一个输出脉冲的硬件,通过改变一个周期高电平(占空比)的时间来对其他的硬件进行控制,比如电机。 呼吸灯的实现利用了人…