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 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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

logback-classic包中ThrowableProxy递归缺陷StackOverflowError解析

logback-classic&#xff08;<1.2.12版本&#xff09;ThrowableProxy类中存在递归缺陷&#xff0c;会导致java.lang.StackOverflowError。改缺陷在1.2.12以上版本(包含该版本)中已修复。 如何复现&#xff1a; 两个异常彼此设置casue&#xff1a; 运行后报以下错误 以上写…

中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程

中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线&#xff0c;可以进入轻松学编程 学习编程捷径&#xff1a;&#xff08;不论是正在学习编程的大学生&#xff0c;还是IT人士或者是编程爱好者&#xff0c;在学习编程的过程中用正确的学习方法 可以达到事半…

python随手小练10(南农作业题)

题目1&#xff1a; 编写程序&#xff0c;输出1~1000之间所有能被4整除&#xff0c;但是不能被5整除的数 具体操作&#xff1a; for i in range(1,1000): #循环遍历1~999&#xff0c;因为range是左闭右开if (i % 4 0) and (i % 5 ! 0) :print(i) 结果展示&#xff1a; 题目2&…

Vue学习之样式汇总

Vue学习之样式汇总 一 二者左右排版 案例 说明&#xff1a;头部一左一右排版&#xff0c;内容一左一右两个排版&#xff0c;公告栏文字超过点点点显示 代码实现 说明&#xff1a; &#xff08;1&#xff09;头部实现一左一右排版需要使用一下两个样式 display: flex;justify-…

nginx 动静分离 防盗链

一、动静分离环境准备静态资源配置(10.36.192.169)安装nginx修改配置文件重启nginx 动态资源配置(192.168.20.135)yum安装php修改nginx配置文件重启nginx nginx代理机配置&#xff08;192.168.20.134&#xff09;修改nginx子自配置文件重启nginx 客户端访问 二、防盗链nginx防止…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-远控介绍及界面编写

红队专题 招募六边形战士队员[1]远控介绍及界面编写1.远程控制软件演示及教程简要说明主程序可执行程序 服务端生成器主机上线服务端程序 和 服务文件管理CMD进程服务自启动主程序主对话框操作菜单列表框配置信息 多线程操作非模式对话框 2.环境&#xff1a;3.界面编程新建项目…

毅速丨增减材协同制造已逐渐成为趋势

近年来&#xff0c;增材制造3D打印技术的发展非常迅速&#xff0c;被广泛应用于航空航天、汽车、电子、医疗等许多行业。增材制造技术通过逐层增加材料的方式制造出各种复杂形状的零件&#xff0c;具有很高的制造效率和灵活性。 然而&#xff0c;在精密加工领域&#xff0c;增材…

STM32 TIM(四)编码器接口

STM32 TIM&#xff08;四&#xff09;编码器接口 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的…

bbr 流相互作用图示

类似 AIMD 收敛图&#xff0c;给出 bbr 的对应图示&#xff1a; bbr 多流相互作用非常复杂&#xff0c;和右下角的 AIMD 相比&#xff0c;毫无美感&#xff0c;但是看一眼左下角的 bbr 单流情况&#xff0c;又过于简陋&#xff0c;而 bbr 的核心就基于这简陋的假设。 浙江温…

力扣每日一题73:矩阵置零

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2…

Unable to find GatewayFilterFactory with name TokenRelay

目录 问题分析解决方案参考文档开源项目微服务商城项目前后端分离项目 问题分析 Spring Cloud Gateway 网关作为代理资源服务器&#xff0c;需要将 JWT 传递给下游资源服务器&#xff0c;下面是网关的配置 spring:cloud:gateway:discovery:locator:enabled: true # 启用服务发…

Rabbitmq----分布式场景下的应用

服务异步通信-分布式场景下的应用 如果单机模式忘记也可以看看这个快速回顾rabbitmq,在做学习 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一…

【Qt之QSetting】介绍及使用

概述 QSettings类提供了一种持久的、与平台无关的应用程序设置存储功能。 用户通常期望一个应用能在不同会话中记住其设置&#xff08;窗口大小和位置&#xff0c;选项等&#xff09;。在Windows上&#xff0c;这些信息通常存储在系统注册表中&#xff1b;在macOS和iOS上&…

通过阿里云创建accessKeyId和accessKeySecret

我们想实现服务端向个人发送短信验证码 需要通过accessKeyId和accessKeySecret 这里可以白嫖阿里云的 这里 我们先访问阿里云官网 阿里云地址 进入后搜索并进入短信服务 如果没登录 就 登录一下先 然后在搜索框搜索短信服务 点击进入 因为我也是第一次操作 我们一起点免费开…

《算法通关村—计算器|逆波兰问题解析》

《算法通关村—计算器|逆波兰问题解析》 计算器问题 描述 LeetCode227.给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。 输入&#xff1a;s "32*2" 输出&#xff1a;7基本思路&#xff1a;理解题目&a…

响应式相册写真摄影网站模板源码

模板信息&#xff1a; 模板编号&#xff1a;28526 模板编码&#xff1a;UTF8 模板颜色&#xff1a;黑白 模板分类&#xff1a;摄像、婚庆、家政、保洁 适合行业&#xff1a;婚纱摄影类企业 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#x…

【SPSS】基于RFM+Kmeans聚类的客户分群分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

精讲双向链表的销毁

相信大家各位学习双向链表的时候对链表的销毁&#xff0c;都或多或少有些小疑惑&#xff0c;我到底是传一级指针还是传二级指针 木关系&#xff0c;这些都是小意思&#xff0c;今天我将为大家share 一下关于到底如何进行正确传指针 对于链表是销毁其实就是对链表进行一个结点一…

Qt配置OpenCV教程,亲测已试过

详细版可参考&#xff1a;Qt配置OpenCV教程&#xff0c;亲测已试过&#xff08;详细版&#xff09;_qt opencv_-_Matrix_-的博客-CSDN博客 软件准备&#xff1a;QtOpenCVCMake (QtOpenCV安装不说了&#xff0c;CMake的安装&#xff0c;我用的是&#xff1a;可参考博客&#x…

Java集成腾讯云OCR身份证识别接口

一、背景 项目用到身份证识别获取人员信息的功能&#xff0c;于是想到了腾讯云提供这样的API。在整合代码过程都很顺利&#xff0c;利用腾讯云官方SDK很快集成进来。但是在上测试环境部署时有了新的问题&#xff0c;通过Nginx代理后的环境无法访问到目标腾讯云接口&#xff0c;…