gin框架学习笔记(三) ——路由请求与相关参数

参数种类与参数处理

查询参数

在讲解查询参数的定义之前,我们先来看一个例子,当我打开了CSDN,我现在想查看我的博客浏览量,那么我就需要点击我的头像来打开我的个人主页,像下面这样:
在这里插入图片描述
我们现在把浏览器的网址取下来,它是下面这样的:

https://blog.csdn.net/qq_73924465?spm=1011.2415.3001.5343

我们尝试来分析一下这个网址:

  • https:表明这个是使用https网络协议来通讯
  • blog.csdn.net:这个指明了它的服务器地址
  • qq_73924465:这个是路径,也是我的id
    那么?spm=1011.2415.3001.5343这一部分内容是什么含义呢?我们要想一下,我点击了我的头像,服务器是怎么知道我是谁进而寻找到我的主页,这就是查询参数的作用了。

查询参数(Query Parameters)通常指的是在网址(URL)中以问号(?)后跟着的一系列键值对,用于向服务器传递特定的信息或请求。这些参数以键值对的形式出现,每个键值对之间用"&"符号分隔。在Web开发中,查询参数常用于向服务器发送请求,例如在搜索引擎中输入关键词时,这些关键词通常会以查询参数的形式附加在URL中,以便服务器根据这些参数返回相应的搜索结果。

而在Gin我们也有专门的方法去获取查询参数,我们来看下面这个例子:

package mainimport ("fmt""github.com/gin-gonic/gin"
)func getQuery(c *gin.Context) {fmt.Println(c.Query("name"))                   //获取指定参数的值fmt.Println(c.QueryArray("name"))              //获取指定参数fmt.Println(c.DefaultQuery("name", "default")) //获取指定参数,如果参数不存在,则返回默认值
}func main() {r := gin.Default()r.GET("/query", getQuery)r.Run(":8080")
}

这里我们以http://127.0.0.1:8080/query?name=id&name=user为例,输出结果:
在这里插入图片描述

动态参数

在我们请求中不止有查询参数,还有一些其他的参数,其中就有动态参数,我们来看一下动态参数的定义:

动态参数是指在程序运行时可以接受并处理不同的参数,以影响其行为或输出结果的机制。在 URL 中,动态参数通常作为 URL 的一部分,直接跟在路径后面,以占位符的形式嵌入其中,例如 example.com/users/:userId 中的 :userId 就是动态参数。

它的作用在于使应用程序更加灵活和可配置。通过在 URL 中传递参数,可以动态地改变应用程序的行为或输出结果,而无需修改代码或重新部署应用程序。

下面我们将演示如何利用Gin框架来获取动态参数:

package mainimport ("fmt""github.com/gin-gonic/gin"
)func _param(c *gin.Context) {fmt.Println(c.Param("user_name"))
}func main() {r := gin.Default()r.GET("/param/:user_name/", _param)r.Run(":8080")
}

这里我们尝试发送请求:
在这里插入图片描述
**备注:**这里使用的是Postman来模拟的请求

表单参数

在我们上网的过程中,我们有时候需要完善个人资料需要填写下面这样的资料表:
在这里插入图片描述
当我们填写信息提交给服务端的时候,服务端就会从我们提交的表单中获取相关信息,接下来我们将演示如何利用Gin框架来获取表单参数:

package mainimport ("fmt""github.com/gin-gonic/gin"
)func _PostForms(c *gin.Context) {fmt.Println(c.PostForm("name"))fmt.Println(c.PostForm("age"))fmt.Println(c.DefaultPostForm("sex", "男"))
}func main() {r := gin.Default()r.POST("postforms", _PostForms)r.Run(":8080")
}

运行结果如下:
在这里插入图片描述

路由请求

Restful风格

RESTful风格是一种基于HTTP协议设计Web API的软件架构风格,由Roy Fielding在2000年提出。它强调使用HTTP动词来表示对资源的操作(GET、POST、PUT、PATCH、DELETE等),并通过URI表示资源的唯一标识符。

  • RESTful API的设计原则
    RESTful API的设计遵循以下几个原则:

    • 基于资源:将数据和功能抽象成资源,并通过URI来唯一标识资源。例 如,一个用户资源可以通过URL“/users/{id}”来访问,其中“{id}”表示该用户的唯一标识符。
      使用HTTP动词:使用HTTP动词来表示对资源的操作,如GET(获取资源)、POST(创建资源)、PUT(更新资源)和DELETE(删除资源)等。
      无状态:每个请求都包含足够的信息来完成请求,服务器不需要保存任何上下文信息。
    • 统一接口:使用统一的接口来简化客户端与服务器之间的交互,包括资源标识符、资源操作和响应消息的格式。
    • 可缓存性:客户端可以缓存响应,以提高性能和减少网络流量。
      分层系统:将系统分为多个层次,每个层次处理特定的功能。

RESTful风格的API设计具有良好的可读性、易用性和可扩展性,广泛应用于Web应用程序和移动应用程序的API设计中。

四大请求方式

在上面有挂你参数的讲解时我们就介绍了相关请求方式GETPUT,而其实除了它们以外,还有很多其他的对数据的操作方式,而今天我们主要介绍的就是四个比较常见的操作方式:

  • Get:从服务器取出资源(一项或多项)
  • Post:在服务器上新建一个资源
  • Put:在服务器上更新资源
  • Delete:从服务上删除资源

接下来我们将以一个事例的方式来演示我们如何俩处理不同的需求:

package mainimport ("encoding/json""fmt""github.com/gin-gonic/gin"
)type ArticleModel struct {Title   string `json:"title"`Content string `json:"content"`
}type Response struct {Code    int    `json:"code"`Data    any    `json:"data"`Message string `json:"message"`
}func _bindJson(c *gin.Context, obj any) (err error) { //从请求中获取 JSON 数据并将其绑定到指定的对象body, _ := c.GetRawData()contnttype := c.GetHeader("Content-Type")switch contnttype {case "application/json":err := json.Unmarshal(body, &obj)if err != nil {fmt.Println("err:", err)return err}}return nil
}// 文章列表页面
func _getList(c *gin.Context) {aricleList := []ArticleModel{{"Go语言入门", "这本书是《Go语言入门》"},{"100天从0精通python", "这本书是《100天从0精通python》"},{"C++ Primer", "这本书是《C++ Primer》"},}c.JSON(200, Response{0, aricleList, "成功"})
}// 获取文章详情
func _getDetail(c *gin.Context) {fmt.Println(c.Param("id"))article := ArticleModel{"Go语言入门","这本书是《Go语言入门》",}c.JSON(200, Response{0, article, "成功"})
}// 创建一篇文章
func _create(c *gin.Context) {var article ArticleModelerr := _bindJson(c, &article)if err != nil {fmt.Println(err)return}c.JSON(200, Response{0, article, "成功"})
}// 更新文章内容
func _update(c *gin.Context) {var article ArticleModelerr := _bindJson(c, &article)if err != nil {fmt.Println(err)return}c.JSON(200, Response{0, article, "成功"})
}func _delete(c *gin.Context) {fmt.Println(c.Param("id"))c.JSON(200, Response{0, map[string]string{}, "成功"})
}func main() {r := gin.Default()r.GET("/articles", _getList)r.GET("/articles/:id", _getDetail)r.POST("/articles", _create)r.PUT("/articles/:id", _update)r.DELETE("/articles/:id", _delete)r.Run(":8080")
}

运行这个程序,我们利用Postman来尝试模拟一下这些请求:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就不一一展示了,大家有兴趣的话可以自己来试试。

请求头与响应头

什么是请求头与响应头

请求头和响应头都是HTTP消息头的一部分,它们是在HTTP通信过程中用于传递元数据的重要组成部分。

  • 请求头(Request Headers):

    • 请求头包含了客户端(例如浏览器、移动应用等)向服务器发送的请求的元数据信息。
    • 请求头通常包括了诸如客户端的User-Agent、Accept、Content-Type等信息,用于告知服务器请求的相关信息。例如,浏览器发送HTTP请求时,请求头中可能包含了用户代理信息、所能接受的数据类型、请求的方法(GET、POST等)等。
  • 响应头(Response Headers):

    • 响应头包含了服务器响应客户端请求时发送的元数据信息。
    • 响应头通常包括了诸如服务器类型、响应的数据类型、响应的状态码等信息,用于告知客户端关于响应的详细信息。例如,当服务器响应浏览器的HTTP请求时,响应头中可能包含了服务器类型、响应的数据类型、响应的状态码等。

获取请求头与响应头

在Gin框架中,定义了它自己的方法区获取请求头与响应头,接下来我们演示一下我们如何基于Gin框架来获取请求头与响应头:

import ("fmt""github.com/gin-gonic/gin"
)// 获取响应头
func Request(c *gin.Context) {fmt.Println(c.Request.Header.Get("user-agent")) //这里不需要考虑大小写的问题,Get函数会做相关处理c.JSON(200, gin.H{"msg": "ok"})
}// 设置响应头
func Response(c *gin.Context) {c.Header("token", "test")c.JSON(200, gin.H{"msg": "ok"})
}func main() {r := gin.Default()r.GET("/request", Request)r.GET("/response", Response)r.Run(":8080")
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

结语

好了,本次的内容就到此为止了,下一篇我们将介绍的就是参数绑定与中间件的使用了,博主平时其实主要还是写cpp,学go其实主要也是想通过这个学习Web开发与云服务,所以对一些常见的知识点比如参数的定义,请求的方式,不对之处还请大家斧正,大家下篇见!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp编译H5解决ios的border-radius失效问题,以及ios满屏显示不全的问题

1.解决方案 .card-itemA {width: 650rpx;height: 326rpx;box-shadow: 0rpx 0rpx 30rpx 14rpx rgba(236, 235, 236, 0.25);background: linear-gradient(180deg, #FFFFFF 0%, rgba(255, 255, 255, 0) 100%);border-radius: 60rpx;overflow: hidden;// 兼容ios的圆角问题transfor…

web入门练手案例(一)

下面是一下web入门案例和实现的代码,带有部分注释,倘若代码中有任何问题或疑问,欢迎留言交流~ 新闻页面 案例描述: 互联网的发展使信息的传递变得方便、快捷,浏览新闻称为用户获取信息的重要渠道。下面将实现一个简…

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍 OrangePi开发板不仅仅是一款消费品,同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具,你可以用它去打造你身边的世界。 特性 CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器GPU MaliG31MP2 Supports…

Nginx解决跨域问题

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 W3C标准&#xff1…

PostgreSQL 用户及授权管理 04:授予及回收权限

PostgreSQL 是一个坚如磐石的数据库,它非常注重安全性,提供了非常丰富的基础设施来处理权限、特权和安全策略。在前面的章节中以我们介绍的基本概念为基础,重新审视角色概念,特别关注授予角色的安全性和权限(角色可以是…

2024年前一季度,国内医疗器械营收TOP10出炉!

随着国内医疗器械市场的不断发展,各大医疗器械公司的财报数据成为了投资者和行业观察者关注的焦点。近日,根据2024年第一季度财报数据,我们梳理出了中国医疗器械第一财季营收排名前十的械企,为大家带来深入的分析和解读。 一、营…

达梦数据库 报错 数据类型不匹配

达梦数据库 报错 数据类型不匹配 背景描述问题分析问题处理方案1:方案2:TO_CHAR(str)CAST(value AS type)CONVERT(type,value)DBMS_LOB 包TEXT_EQUAL(n1,n2) 写在最后 背景描述 本文写于初接触到达梦(DM)数据库,之前没有用过,因此…

《四》系统模块整体功能关联与实现

在上一篇里,我们完成了动作的创建,那么这一次,我们把它加载到界面上,把需要是实现的动作都加上。 MyWord::MyWord(QWidget *parent): QMainWindow(parent) {mdiAreanew QMdiArea;mdiArea->setHorizontalScrollBarPolicy(Qt::S…

Python爬虫逆向——某公开数据网站实例小记(二)

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:分析页面和请求方式 aHR0cHM6Ly95Z3AuZ2R6d2Z3Lmdvdi5jbi8jLzQ0L2p5Z2c 此网站经…

ORACLE ODA一体机存储节点电源故障的分析处理

近期,某用户的ORACLE ODA一体机在例行机房巡检时出现亮黄灯告警;用户反馈次问题后我们立刻通过远程方式,登陆ODA的控制台进行查看; 对于ODA一体机(2个计算节点1个存储节点),计算节点可以通过il…

HTTP协议及应用

一.HTTP协议 1.HTTP协议版本 HTTP1.0:服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态); HTTP1.1:KeepAlived长连接避免了连接建立和…

卷积神经网络CNN的运行过程、常见术语与问题

目录 一、CNN运行过程 1、卷积(Convolution) 2、激活函数(activation function) 3、池化(pooling) 3.1 池化操作 3.2 池化过程 3.3 池化后结果 4、Flatten 5、全连接层 Flatten层的操作 全连接层…