当前位置: 首页 > news >正文

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开发与云服务,所以对一些常见的知识点比如参数的定义,请求的方式,不对之处还请大家斧正,大家下篇见!

相关文章:

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

参数种类与参数处理 查询参数 在讲解查询参数的定义之前,我们先来看一个例子,当我打开了CSDN,我现在想查看我的博客浏览量,那么我就需要点击我的头像来打开我的个人主页,像下面这样: 我们现在把浏览器的网址取下来,…...

HTML常用标签-多媒体标签(图片、音频、视频)

多媒体标签 1 图片标签2 音频标签3 视频标签 1 图片标签 img(重点) 图片标签,用于在页面上引入图片 代码 <!-- src用于定义图片的连接 title用于定义鼠标悬停时显示的文字 alt用于定义图片加载失败时显示的提示文字 --> <img src"路径" title"悬停显…...

Flutter 中的 AnimatedIcon 小部件:全面指南

Flutter 中的 AnimatedIcon 小部件&#xff1a;全面指南 AnimatedIcon是Flutter Material组件库中的一个独特动画组件&#xff0c;它允许开发者在两个图标之间进行平滑的过渡动画。这使得它非常适合用于表示应用程序的状态变化&#xff0c;如菜单打开/关闭、搜索打开/关闭等。…...

0510Goods的Maven项目

0510Goods的Maven项目包-CSDN博客 数据库字段 商品主页 修改页面 点击商品主页更改信息&#xff0c; 跳转到修改页面&#xff0c; 并保留初始信息。 商品类别最多选取三项&#xff0c;最少选取一项 添加界面 商品类别最多选取三项&#xff0c;最少选取一项...

使用Pyramid、Mako和PyJade生成 HTML

Pyramid 是一个流行的 Python Web 框架&#xff0c;而 Mako 和 PyJade 是用于模板引擎的工具&#xff0c;它们可以与 Pyramid 配合使用来生成 HTML 内容。但是在实际使用中还是有些差别的&#xff0c;尤其会遇到各种各样的问题&#xff0c;下面我将利用我所学的知识一一为大家解…...

什么是Facebook付费广告营销?

Facebook作为全球最大的社交平台之一&#xff0c;成为了跨境卖家不可或缺的营销阵地。它不仅拥有庞大的用户基数&#xff0c;还提供了丰富的广告工具和社群互动功能&#xff0c;让商家能够精准触达目标市场&#xff0c;提升品牌影响力。云衔科技通过Facebook付费广告营销的专业…...

面对.halo勒索病毒,如何有效防范与应对?

导言&#xff1a; 随着网络技术的不断发展&#xff0c;网络安全问题也日益凸显。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;近年来在全球范围内频发。其中&#xff0c;.halo勒索病毒作为勒索病毒家族中的一员&#xff0c;其危害性和传播性不容忽视…...

JSON 转为json串后出现 “$ref“

问题描述 转为JSON 串时出现 "$ref":"$.RequestParam.list[0]" $ref&#xff1a; fastjson数据重复的部分会用引用代替&#xff0c;当一个对象包含另一个对象时&#xff0c;fastjson就会把该对象解析成引用 “$ref”:”..” 上一级 “$ref”:”” 当前对…...

Nachi那智不二越机器人维修技术合集

一、Nachi机械手维护基础知识 1. 定期检查&#xff1a;定期检查机器人的各个部件&#xff0c;如机械手伺服电机、机器人减速器、机械臂传感器等&#xff0c;确保其运行正常。 2. 清洁与润滑&#xff1a;定期清洁Nachi工业机器人表面和内部&#xff0c;并使用合适的润滑油进行润…...

C++类与对象基础探秘系列(二)

目录 类的6个默认成员函数 构造函数 构造函数的概念 构造函数的特性 析构函数 析构函数的概念 析构函数的特性 拷贝构造函数 拷贝构造函数的概念 拷贝构造函数的特性 赋值运算符重载 运算符重载 赋值运算符重载 const成员 const修饰类的成员函数 取地址及const取地址操作…...

MyBatis-Plus核心功能详解:条件构造器、自定义SQL与Service接口

在Java的Web开发中&#xff0c;MyBatis-Plus作为MyBatis的增强工具&#xff0c;提供了许多实用的功能&#xff0c;极大地简化了数据库操作的开发过程。下面&#xff0c;我们将详细探讨MyBatis-Plus的三大核心功能&#xff1a;条件构造器、自定义SQL以及Service接口。 一、条件…...

莆田市C++专项选拔第二轮题4

题4&#xff1a;变换阵型 【题目描述】 盛隆同学刚学完C的二维数组和函数部分&#xff0c;于是他自己写了2个函数对二维数组进行练习。两个函数如下&#xff1a; int n, a[1005][1005]; // 注意&#xff0c;这里的n和数组a是全局变量 void f1() {for (int i 1; i < n; i)…...

AtCoder Regular Contest 177

A - Excange 题意 用这些零钱能否不找零地买这些物品 思路 因为 500 5 100 10 50 50 10 500 1 5005\times 10010\times 5050\times 10500\times 1 5005100105050105001。 所以说&#xff0c;我们这道题可以采用贪心算法&#xff0c;优先取大的减去目前零钱最大的…...

【C++】 C++ 编写 鸡兔同笼程序

文章目录 “鸡兔同笼”问题是一个经典的数学问题&#xff0c;要求根据总头数和总腿数来计算鸡和兔的数量。假设鸡有 2 条腿&#xff0c;兔有 4 条腿。可以通过以下步骤求解这个问题&#xff1a; 1 .设鸡的数量为 x&#xff0c;兔的数量为 y。2.根据题意&#xff0c;我们有以下…...

[动画详解]LeetCode151.翻转字符串里的单词

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…...

如何使用 ArcGIS Pro 制作地震动画

在做某些汇报的时候&#xff0c;除了图文&#xff0c;如果有动画肯定会成为加分项&#xff0c;这里为大家介绍一下如何使用 ArcGIS Pro 制作地震动画&#xff0c;希望能对你有所帮助。 添加时间 在图层属性内&#xff0c;选择时间选项卡&#xff0c;图层时间选择每个要素具有…...

Unity 初步了解

1.Unity 是啥 Unity是一个实时3D互动内容创作和运营平台。它可以帮助游戏开发、美术、建筑、汽车设计、影视等行业的创作者将创意变为现实。Unity平台提供了一套完善的软件解决方案&#xff0c;用于创作、运营和变现任何实时互动的2D和3D内容&#xff0c;支持的平台包括手机、…...

爬虫学习(4)每日一笑

代码 import requests import re import osif __name__ "__main__":if not os.path.exists("./haha"):os.makedirs(./haha)url https://mlol.qt.qq.com/go/mlol_news/varcache_article?docid6321992422382570537&gameid3&zoneplat&webview…...

生产环境节点扩容方案

datanode节点扩缩容(1人天) 注意:新增节点需要走商务,节点扩容需要申请新的license 制品包下载 #内网下载(环境检查脚本) wget --user=admin --password=Y!bC2hx0TN@21cal http://10.69.71.180:8082/artifactory/product/qiudongyang/precheck/os-check20221127.tar…...

Spring线程池配置

配置Spring线程池,特别是ThreadPoolTaskExecutor,通常涉及设置一些关键参数以控制线程池的行为和性能。以下是一些基本的配置步骤: 定义配置类 首先,需要创建一个配置类,使用@Configuration注解标记,并启用异步执行功能,使用@EnableAsync注解。 @Configuration @Enab…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...