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

news2025/4/12 20:06:44

参数种类与参数处理

查询参数

在讲解查询参数的定义之前,我们先来看一个例子,当我打开了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 main

import (
	"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 main

import (
	"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 main

import (
	"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 main

import (
	"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 ArticleModel
	err := _bindJson(c, &article)
	if err != nil {
		fmt.Println(err)
		return
	}
	c.JSON(200, Response{0, article, "成功"})
}

// 更新文章内容
func _update(c *gin.Context) {
	var article ArticleModel
	err := _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.coloradmin.cn/o/1675247.html

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

相关文章

在linux里登录远程服务器

在linux里登录远程服务器。在虚拟终端里输入命令: ssh 远程服务器ip -l username 然后输入登录密码,就可以登录到远程服务器的命令行界面。登录方便,字体也可以在本地机的虚拟终端里设置得大一点。 下面是一张截屏图片。

【高阶数据结构】LRU Cache -- 详解

一、什么是 LRU Cache LRU(Least Recently Used),意思是最近最少使用,它是一种 Cache 替换算法。 什么是 Cache? 狭义的 Cache 指的是位于 CPU 和主存间的快速 RAM,通常它不像系统主存那样使用 DRAM 技术&…

二叉树基础oj练习【11道题】

二叉树基础oj练习 1.单值二叉树 题目: 单值二叉树 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false。 示例 1: 输入:[1,1,1…

Pycharm导入自定义模块报红

文章目录 Pycharm导入自定义模块报红1.问题描述2.解决办法 Pycharm导入自定义模块报红 1.问题描述 Pycharm 导入自定义模块报红,出现红色下划线。 2.解决办法 打开【File】->【Setting】->【Build,Execution,Deployment】->【Console】->【Python Con…

HTML的使用(中)

文章目录 前言一、HTML表单是什么&#xff1f;二、HTML表单的使用 &#xff08;1&#xff09;<form>...</form>表单标记&#xff08;2&#xff09;<input>表单输入标记总结 前言 在许多网页平台上浏览&#xff0c;大多逃不了登录账号。此时在网页中填写的用户…

5G消息和5G阅信的释义与区别 | 赛邮科普

5G消息和5G阅信的释义与区别 | 赛邮科普 在 5G 技术全面普及的当下&#xff0c;历史悠久的短信服务也迎来了前所未有的变革。5G 阅信和 5G 消息就是应运而生的两种短信形态&#xff0c;为企业和消费者带来更加丰富的功能和更加优质的体验。 这两个产品名字和形态都比较接近&am…

在数据库中使用存储过程插入单组/多组数据

存储过程可以插入单组数据&#xff0c;也可以以字符串的形式插入多组数据&#xff0c;将字符串中的信息拆分成插入的数据。 首先建立一个简单的数据库 create database student; use student;选中数据库之后建立一张学生表 create table stu(uid int primary key,uname varc…

解决Android Studio Gradle下载慢的问题

安卓 gradle-7.5-bin.zip 下载慢 https://mirrors.cloud.tencent.com/gradle/7.x.x 找到对应匹配版本 把下载的文件直接复制到 C:\Users\Administrator.gradle\wrapper\dists\gradle-x.x\ 中对应版本目录下&#xff0c;例如需要下载 gradle-2.14.1-all.zip&#xff0c;则下载好…

最新版Ceph( Reef版本)块存储简单对接k8s(上集)

当前ceph 你的ceph集群上执行 1.创建名为k8s-rbd 的存储池 ceph osd pool create k8s-rbd 64 642.初始化 rbd pool init k8s-rbd3 创建k8s访问块设备的认证用户 ceph auth get-or-create client.kubernetes mon profile rbd osd profile rbd poolk8s-rbd部署 ceph-rbd-csi c…

Spring MVC(四) 数据校验

在开发过程中有一环必不可少的部分就是数据校验&#xff0c;用户在页面中填写的数据通过表单提交时&#xff0c;前端的JS可以做一些是否合法性的验证&#xff0c;比如是否为空、两次密码是否一致、格式是否正确等等验证。当数据到了后台控制器&#xff0c;为了确保程序的健壮性…

steam商店打不开、steam商店错误代码-118的解决方法

现在steam已经开始了&#xff0c;有很多好玩的游戏都在这段时间相继打折&#xff0c;虽然游戏众多&#xff0c;但是不是所有人都能把这些游戏都买下来&#xff0c;有一些小伙伴喜欢的游戏苦于没有足够的资本去购买&#xff0c;steam会以各种名义举办特惠活动吸引玩家们&#xf…

2024国考行测、申论资料大全,做好备考真的很重要!

1. 国考是什么? 国考,全称国家公务员考试,是选拔国家公务员的重要途径。通过国考,你将有机会进入政府部门,为国家建设贡献力量。 2. 国考难在哪里? 国考之所以难,主要体现在以下几个方面: (1) 竞争激烈 每年国考报名人数都在百万以上,而录取率却不足2%。千军万马过独木桥…

Linux学习笔记8---官方 SDK 移植实验

在上一章中&#xff0c;我们参考 ST 官方给 STM32 编写的 stm32f10x.h 来自行编写 I.MX6U 的寄存器定义文件。自己编写这些寄存器定义不仅费时费力&#xff0c;没有任何意义&#xff0c;而且很容易写错&#xff0c;幸好NXP 官方为 I.MX6ULL 编写了 SDK 包&#xff0c;在 SDK 包…

最新Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c;其中最常用的是通过命令行工具进行。 ImageMagick是一个非常强大的图像处理工具集&#xff0c;它包含了许多用于图像转换的命令。 一、安装ImageMagick&#xff08;如果尚未安装&#xff09;&#xff1…

安卓悬浮窗----可移动的悬浮窗

目录 前言一、添加对悬浮窗功能的支持二、通过service实现悬浮窗2.1 窗口属性和标志2.2 窗口移动 三、完整代码 前言 记录一下基础的悬浮窗实现&#xff0c;分为几个重要的点进行阐述。 一、添加对悬浮窗功能的支持 app要实现悬浮窗功能&#xff0c;首先app要添加对悬浮窗功…

超链接a的应用

主要作用&#xff1a;从当前页面进行跳转 1.跳转到页面 <!-- 跳转到其他页面 --><a href"#" target"_blank">鸡你太美</a> <!-- 跳转到本地页面 --><a href"#" target"_self">鸡你太美</a> 2.跳转…

RAG 面向 LLM: 基于检索增强的大语言模型调研

摘要 作为 AI 领域最先进的技术之一,检索增强生成(RAG)技术可以提供可靠和最新的外部知识,为众多任务提供巨大的便利。特别是在 AI 生成内容(AIGC)时代,RAG 中检索强大的提供额外知识的能力使得检索增强生成能够辅助现有生成式 AI 生产高质量输出。最近,大语言模型(LLM)在语言…

Vue3组件库开发项目实战——03封装Button组件/输出vitePress文档

Vue3组件库开发项目实战——01组件开发必备知识导学-CSDN博客 Vue3组件库开发项目实战——02项目搭建&#xff08;配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest&#xff09;-CSDN博客 在前面两篇博客中&#xff0c;我分别介绍了组件库开发必学知识&#xff0c;以及…

整合Tess4J图文识别技术

仓库地址&#xff1a;https://gitee.com/z3inc/tess4j-demo.git 1. OCR图文识别介绍 OCR&#xff08;全称 Optical Character Recognition&#xff0c;直译为光学字符识别&#xff09;用于图片文字识别&#xff0c;例如 提取图片中车牌号等等。 Java中实现OCR的技术方案有&…

文本到语音的学习笔记:从Docker开始

1.docker 是什么意思&#xff1f; Docker 是一种开源的容器化平台&#xff0c;它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中&#xff0c;然后可以在任何支持Docker的系统上运行这个应用&#xff0c;而不必担心环境差异导致的问题。 以下是Docker的一些关键特…