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

news2025/5/14 3:28:47

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 main

import (
	"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.coloradmin.cn/o/1145554.html

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

相关文章

中颖单片机SH367309全套量产PCM,专用动力电池保护板开发资料

方案总体介绍 整套方案硬件部分共2块板子,包括MCU主板,采用SH79F6441-32作为主处理器。MCU主板包括2个版本。PCM动力电池保护板采用SH367309。 软件方案采用Keil51建立的工程,带蓝牙的版本,支持5~16S电池。 硬件方案--MCU主板 MC…

【用户登录】模块之登录认证+鉴权业务逻辑

用户登录——⭐认证功能的流程图: ⭐鉴权流程图: 用户登录功能的Java代码实现 1. 实体类-User orm框架:JPA Table(name "user_tab") Entity Data NoArgsConstructor AllArgsConstructor public class User implements Serializ…

果蔬购物商城管理与推荐系统Python+Django网页界面+协同过滤推荐算法

一、介绍 果蔬购物管理与推荐系统。本系统以Python作为主要开发语言,前端通过HTML、CSS、BootStrap等框架搭建界面,后端使用Django框架作为逻辑处理,通过Ajax实现前后端的数据通信。并基于用户对商品的评分信息,采用协同过滤推荐…

机器学习---使用 TensorFlow 构建神经网络模型预测波士顿房价和鸢尾花数据集分类

1. 预测波士顿房价 1.1 导包 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport itertoolsimport pandas as pd import tensorflow as tftf.logging.set_verbosity(tf.logging.INFO) 最后一行设置了Ten…

Spring Security获得认证流程解析(示意图)

建议先看完Spring Security总体架构介绍和Spring Security认证架构介绍,然后从FilterChainProxy的doFilterInternal函数开始,配合文章进行debug以理解Spring Security认证源码的执行流程。 在之前的Spring Security认证架构介绍中,我们已经知…

一文详解汽车电子CAN总线

0.什么是CAN总线 CAN总线(控制器区域网络)是一个中央网络系统,连接不同的电子控制单元(ECU)以及车辆中的其他设备。现在的汽车可以有100个ECU,因此CAN总线通信变得非常重要。 1.CAN总线流行的背景 集中式:CAN总线系统允许对连接到网络的ECU进行集中控制…

Redis快速上手篇七(集群-一台虚拟机六个节点)

​​​​​​http://t.csdnimg.cn/S0NpK与上篇六个虚拟机配置基本一样有不懂可以看上篇配置实例 集群搭建 根据上篇文章,本篇只着重于小方面的配置差别 配置集群一般不要设置密码 1.搭建一台虚拟机后再安装目录下新建文件夹 redis_cluster 2.在文件夹内创建六个文…

python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解

这篇文章主要介绍了python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 JDBC Request 这个 Sampler 可以向数据库…

C# 图解教程 第5版 —— 第11章 结构

文章目录 11.1 什么是结构11.2 结构是值类型11.3 对结构赋值11.4 构造函数和析构函数11.4.1 实例构造函数11.4.2 静态构造函数11.4.3 构造函数和析构函数小结 11.5 属性和字段初始化语句11.6 结构是密封的11.7 装箱和拆箱(*)11.8 结构作为返回值和参数11…

AK F.*ing leetcode 流浪计划之delaunay三角化

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:给定二维点进行delaunay三角化 参考资料: 算法步骤与框架: https://oi-wiki.org//geometry/triangulation/ 空圆性深入解…

黑客技术(网络安全)—小白自学

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类&am…

本来打算做功能测试的,但是发现playwright太好玩了,玩了一天,功能测试进度为空

本文是作者的自言自语://todo 未完待续 https://blog.csdn.net/lineuman 微软果然有大牛啊!有能人的公司总是令人敬佩。 playwright这种级别的工具简直就是核弹级别的。 当我开始使用playwright的时候,嘭的一下,我的世界炸了&…

ResNet(CVPR2016)

文章目录 AbstractIntroductionRelated WorkResidual RepresentationsShortcut Connections Deep Residual LearningResidual LearningIdentity Mapping by Shortcuts ExperimentConclusion 原文链接 Abstract 深层的神经网络更难训练,我们提出了一个残差学习框架&…

数据结构与算法--复杂度

目录 1.算法效率 1.1 如何衡量一个算法的好坏 1.2 算法的复杂度 1.3 复杂度在校招中的考察 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 3.空间复杂度 4. 常见复杂度对比 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的…

VirtualBox网络配置

1. 进入虚拟机所在系统的网络设置 2. 网卡1连接方式选择为仅主机网络,界面名称选择自带的网卡 3.自带网卡的配置方式,通常已经配置好了,保持dhcp开启即可 4.网卡2选择nat转换即可,无需添加其他配置 5.启动虚拟机所在系统&#xff…

数组OJ题汇总(一)

本专栏内容为:leetcode刷题专栏,记录了leetcode热门题目以及重难点题目的详细记录 💓博主csdn个人主页:小小unicorn ⏩专栏分类:Leetcode 🚚代码仓库:小小unicorn的代码仓库🚚 &…

MSQL系列(十) Mysql实战-Join驱动表和被驱动表区分

Mysql实战-Join驱动表和被驱动表区分 前面我们讲解了Mysql的查询连接Join的算法原理, 我发现大家都知道小表驱动大表,要让小表作为驱动表, 现在有2个问题 查询多表, 到底哪个是驱动表?哪个是被驱动表, 如何区分?索引如何优化,到底是加在驱动表上,还是被驱动表上? 今天我们…

[Leetcode] 0108. 将有序数组转换为二叉搜索树

108. 将有序数组转换为二叉搜索树 题目描述 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a…

【Android内存优化】内存泄露优化之强引用变弱引用完全详解

内存泄露背景 什么是内存泄露 内存空间使用完毕后无法被释放的现象,对于还保持着引用, 该内存不能再被分配使用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们。 所以逻辑不再使用的对象,需要释放强引用,以便GC进行回收。 JVM 工作原理 JVM 垃圾回收原理,点…

vlc打开网络流(如rtmp),并查看媒体信息(如编码格式等编码信息)

打开vlc 选择媒体,打开网络串流 输入rtmp地址,点击播放 选择工具-编解码信息 可以查看节目的编码信息什么的