Go学习第十三章——Gin入门与路由

Go web框架——Gin入门与路由

    • 1 Gin框架介绍
      • 1.1 基础介绍
      • 1.2 安装Gin
      • 1.3 快速使用
    • 2 路由
      • 2.1 基本路由
        • GET请求
        • POST请求
      • 2.2 路由参数
      • 2.3 路由分组
        • 基本分组
        • 带中间件的分组
      • 2.4 重定向

1 Gin框架介绍

github链接:https://github.com/gin-gonic/gin

中文文档:https://gin-gonic.com/zh-cn/docs/

学习链接(博主在bilibili有视频):http://www.fengfengzhidao.com/

1.1 基础介绍

Gin是一个轻量级的、高性能的web框架,由Golang语言开发。Gin的核心设计理念是提供快速建立API的开发方式,同时保持良好的性能和高度易用性。

下面是Gin框架的主要特点:

  1. 快速性能 – Gin采用了诸如Like-nginx等类似的底层库,因此Gin的性能非常高,可以达到每秒处理数百万个请求的水平。
  2. 简单易用 – Gin框架采用了类似于Martini的API设计,非常容易学习和使用。
  3. 模块化 – Gin的中间件机制使其易于构建和扩展应用程序。
  4. 松散耦合 – Gin的设计允许使用者在不破坏当前应用的前提下快速添加新的特性或更改现有特性。
  5. 适用范围广 – Gin的设计允许用户构建任何类型的web应用程序,包括API、代理、Websocket服务等。

除此之外,Gin框架还提供了大量的中间件来提供更加丰富的功能,例如日志、跨域请求、认证和授权、压缩等。

1.2 安装Gin

要求:Go 1.13 及以上版本

  1. 创建一个新项目

注意我们创建项目要添加一个国内的代理,不然下载会很慢或者失败

代理:GOPROXY=https://goproxy.cn,direct

image-20231027212951323

  1. 下载并安装Gin
go get -u github.com/gin-gonic/gin

然后,我们会在go.mod里面会发现多了很多东西,这些就Gin,直接使用

  1. 安装postman

主要是用于对接口进行调试的工具,有类似的工具都可以,例如:Apifox

postman官网:https://www.postman.com/downloads/?utm_source=postman-home

1.3 快速使用

  1. 创建文件夹和文件

我这里创建了一个GinStudy01_HelloWord的文件夹,在里面又创建了一个main文件夹,在里面创建main文件

  1. 将 gin 引入到代码中:
import "github.com/gin-gonic/gin"
  1. (可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包:
import "net/http"
  1. 写代码
package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {router := gin.Default()router.GET("/index", func(c *gin.Context) {c.String(http.StatusOK, "Hello World")})// 启动方式一router.Run(":8000") // 监听并在 0.0.0.0:8000 上启动服务// 启动方式二// http.ListenAndServe(":8000", router)
}

然后运行,等待一会,成功后,游览器访问:http://127.0.0.1:8000/index,会发现有Hello World

image-20231027220019136

  1. router:=gin.Default():这是默认的服务器。使用gin的Default方法创建一个路由Handler
  2. 然后通过Http方法绑定路由规则和路由函数。不同于net/http库的路由函数,gin进行了封装,把requestresponse都封装到了gin.Context的上下文环境中。
  3. 最后启动路由的Run方法监听端口。还可以用http.ListenAndServe(":8080", router),或者自定义Http服务器配置。

2 路由

本文将介绍Gin框架的路由功能,包括路由的基本使用、路由参数、路由分组、重定向、请求响应和中间件等。

2.1 基本路由

Router是Gin框架中的一个HTTP路由。Gin框架使用Router来接受HTTP请求,并根据请求的路径和HTTP方法来判断执行的处理函数。

Gin框架的Router支持HTTP的所有方法:GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。

我们首先需要引入gin包:

import "github.com/gin-gonic/gin"

然后创建一个Gin框架的Router:

r := gin.Default()
GET请求

使用GET方法,接受GET方式的HTTP请求。

func main() {r := gin.Default()r.GET("/hello", func(c *gin.Context) {c.String(http.StatusOK, "Hello World")})r.Run(":8080")
}

当我们访问http://localhost:8080/hello时,就能够在浏览器上看到输出了"Hello World"。

POST请求

使用POST方法,接受POST方式的HTTP请求。

import ("github.com/gin-gonic/gin""net/http"
)
// 这里只是把func给提出来,这样代码看起来更简洁了
func postRequest(c *gin.Context) {username := c.PostForm("username")password := c.PostForm("password")c.JSON(http.StatusOK, gin.H{"username": username,"password": password,})
}func main() {r := gin.Default()// post请求r.POST("/login", postRequest)r.Run(":8080")
}

当我们通过POST方式,访问http://localhost:8080/login,然后通过POST方法提交username和password参数,就能够在返回结果中看到我们提交的参数值。

至于其他的请求,略。。。。

2.2 路由参数

Gin框架中的Router支持动态路由参数,在路由路径中使用冒号加参数名的方式表示参数。

func main() {r := gin.Default()r.GET("/users/:id", func(c *gin.Context) {id := c.Param("id")c.String(http.StatusOK, "User ID: %s", id)})r.Run(":8080")
}

使用Param方法获取路由中的参数值。

当我们访问http://localhost:8080/users/123时,就能够在浏览器上看到输出了"User ID: 123"。

image-20231027222029276

2.3 路由分组

Gin框架的Router也支持路由分组,可以按照功能分组路由,这样能够更好地管理代码,并且能够为每个路由分组设置不同的中间件。

基本分组

我们可以使用Gin框架的Group方法将路由按照功能进行分组。

func main() {r := gin.Default()api := r.Group("/api"){api.GET("/users", func(c *gin.Context) {c.String(http.StatusOK, "API Users")})api.GET("/products", func(c *gin.Context) {c.String(http.StatusOK, "API Products")})}admin := r.Group("/admin"){admin.GET("/users", func(c *gin.Context) {c.String(http.StatusOK, "Admin Users")})admin.GET("/products", func(c *gin.Context) {c.String(http.StatusOK, "Admin Products")})}r.Run(":8080")
}

我们可以将API路由和管理员路由分别归为一个Group,并在Group中设置对应的路由处理函数。

当我们访问http://localhost:8080/api/users和http://localhost:8080/admin/users时,就能够在浏览器上看到输出了"API Users"和"Admin Users"。

带中间件的分组

中间件还没有讲解,等后面学到了,可以再回来看~

我们还可以在路由分组中指定中间件,这样能够更好地进行控制,对于需要进行身份验证或者请求限制的路由,我们需要通过Group进行中间件的指定。

func main() {r := gin.Default()api := r.Group("/api"){api.Use(AuthMiddleware())api.GET("/users", func(c *gin.Context) {c.String(http.StatusOK, "API Users")})api.GET("/products", func(c *gin.Context) {c.String(http.StatusOK, "API Products")})}admin := r.Group("/admin"){admin.Use(AuthMiddleware(), LimitMiddleware())admin.GET("/users", func(c *gin.Context) {c.String(http.StatusOK, "Admin Users")})admin.GET("/products", func(c *gin.Context) {c.String(http.StatusOK, "Admin Products")})}r.Run(":8080")
}

使用Use方法指定中间件,多个中间件可以通过逗号分隔。

2.4 重定向

在Gin中,我们可以使用路由重定向功能将一条路由重定向到另一条路由。

func main() {r := gin.Default()r.GET("/users", func(c *gin.Context) {c.Redirect(http.StatusMovedPermanently, "/api/users")})r.GET("/api/users", func(c *gin.Context) {c.String(http.StatusOK, "API Users")})r.Run(":8080")
}

当我们访问http://localhost:8080/users时,Gin框架会将请求重定向到http://localhost:8080/api/users。

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

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

相关文章

基础课13——数据异常处理

数据异常是指数据不符合预期或不符合常识的情况。数据异常可能会导致数据分析结果不准确,甚至是错误,因此在进行数据分析之前需要对数据进行清洗和验证。 常见的数据异常包括缺失值、重复值、异常值等。 缺失值是指数据中存在未知值或未定义的值&#…

详解类生到死的来龙去脉

类生命周期和加载过程 一个类在 JVM 里的生命周期有 7 个阶段,分别是加载(Loading)、校验(Verification)、准备(Preparation)、解析(Resolution)、初始化(Ini…

前端 :用HTML , CSS ,JS 做一个秒表

1.HTML&#xff1a; <body><div id "content"><div id "top"><div id"time">00:00:000</div></div><div id "bottom"><div id "btn_start">开始</div><div …

网络协议--TCP的保活定时器

23.1 引言 许多TCP/IP的初学者会很惊奇地发现可以没有任何数据流通过一个空闲的TCP连接。也就是说&#xff0c;如果TCP连接的双方都没有向对方发送数据&#xff0c;则在两个TCP模块之间不交换任何信息。例如&#xff0c;没有可以在其他网络协议中发现的轮询。这意味着我们可以…

【计算机网络】数据链路层——以太网

文章目录 前言什么是以太网以太网帧格式6位目的地址和源地址2位类型数据长度CRC 校验和 数据在数据链路层是如何转发的 前言 前面我们学习了关于应用层——自定义协议、传输层——UDP、TCP协议、网络层——IP协议&#xff0c;今天我将为大家分享关于数据链路层——以太网方面的…

【机器学习】决策树与分类案例分析

决策树与分类案例分析 文章目录 决策树与分类案例分析1. 认识决策树2. 分类3. 决策树的划分依据4. 决策树API5. 案例&#xff1a;鸢尾花分类6. 决策树可视化7. 总结 1. 认识决策树 决策树思想的来源非常朴素&#xff0c;程序设计中的条件分支结构就是if-else结构&#xff0c;最…

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇3)#涂国旗 #重新排序

目录 题目&#xff1a;涂国旗 思路&#xff1a; 题目&#xff1a;重新排序 思路&#xff1a; 题目&#xff1a;涂国旗 思路&#xff1a; 乍一看好像没啥思路&#xff0c;但是我们需要涂最少的格子&#xff0c;所以要都尝试一下才行&#xff0c;也就是从上面开始白至少一行&am…

python自动化测试(七):鼠标事件

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; py的selenium版本是3.11.0 目录 一、前置代码 二、ActionChains类 三、鼠标事件 3.1 悬停事件 3.2 左键单击 3…

python爬虫之正则表达式解析实战

文章目录 1. 图片爬取流程分析2. 实现代码—爬取家常菜图片 1. 图片爬取流程分析 先获取网址&#xff0c;URL&#xff1a;https://www.xiachufang.com/category/40076/ 定位想要爬取的内容使用正则表达式爬取导入模块指定URLUA伪装&#xff08;模拟浏览器&#xff09;发起请求…

scratch图书的ISBN码校验 2023年9月中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析

目录 scratch图书的ISBN码校验 一、题目要求 1、准备工作 2、功能实现 二、案例分析

LED数码管的静态显示与动态显示(Keil+Proteus)

前言 就是今天看了一下书上的单片机实验&#xff0c;发现很多的器件在Proteus中都不知道怎么去查找&#xff0c;然后想做一下这个实验&#xff0c;尝试能不能实现&#xff0c;LED数码管的两个还可以实现&#xff0c;但是用LED点阵显示器的时候他那个网络标号不知道是什么情况&…

基于UDP/TCP的网络通信编程实现

小王学习录 今日鸡汤Socket套接字基于UDP来实现一个网络通信程序DatagramSocket类DatagramPacket类基于UDP的服务器端代码基于UDP的客户端代码基于TCP来实现一个网络通信程序ServerSocket类Socket类基于TCP的服务器端代码基于TCP的客户端代码优化之后的服务器端代码补充TCP长短…

【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置

文章目录 一、初识 MyBatis Plus1.1 MyBatis Plus 是什么1.2 MyBatis Plus 和 MyBatis 的区别 二、在 Spring Boot 项目中集成 MyBatis Plus2.1 环境准备2.2 引入 MyBatis Plus 依赖2.3 定义 Mapper2.4 测试 MyBatis Plus 的使用 三、MyBatis Plus 常用注解3.1 为什么需要注解3…

rust 创建多线程web server

创建一个 http server&#xff0c;处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议&#xff0c;http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象&#xff0c;监听地址为127.0.0.1:8080. us…

css文字竖向排列

div { writing-mode: vertical-rl;text-orientation: upright;font-size: .25rem; //文字大小letter-spacing: 0.1em; //文字间距}

常用第三方库

Moment GTC(Greenwish Mean Time)&#xff1a;格林威治时间&#xff0c;太阳时&#xff0c;精确到毫秒UTC(Universal Time Coodinated)&#xff1a;世界协调时间&#xff0c;原子种计时&#xff0c;精确到纳秒 GTC和UTC都是以0时区作为标准时间戳&#xff1a;以UTC的1970-1-1 …

python自动化测试(五):按键模拟输入:全选、复制、清空、粘贴、完成

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; Google驱动的selenium版本是3.11.0 目录 一、配置代码 二、键盘组合输入 2.1 全选&#xff1a;ctrl a 2.2 复制…

OpenCV官方教程中文版 —— Hough 直线变换

OpenCV官方教程中文版 —— Hough 直线变换 前言一、原理二、OpenCV 中的霍夫变换三、Probabilistic Hough Transform 前言 目标 • 理解霍夫变换的概念 • 学习如何在一张图片中检测直线 • 学习函数&#xff1a;cv2.HoughLines()&#xff0c;cv2.HoughLinesP() 一、原理…

DIY相机(一)libcamera库

相机选型 DIY相机首先是要确定使用的相机型号。兼容树莓派&#xff0c;画质好一些的&#xff0c;目前主要有两款&#xff1a;一是Raspberry Pi Camera Module 3&#xff0c;二是Raspberry Pi HQ Camera。 下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等…

JDK21下载和安装

说明 本文介绍 JDK21&#xff08;Oracle版&#xff09;的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型&#xff0c;下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包&#xff0c;开始安装。 把路径改为自定…