Gin 框架入门

Gin 框架入门

一、响应数据

JSON 响应

在 Web 开发中,JSON 是一种常用的数据交换格式。Gin 提供了简便的方法来响应 JSON 数据。

package mainimport ("github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/json", func(c *gin.Context) {c.JSON(200, gin.H{"message": "hello json",})})r.Run(":8080")
}

在上述代码中,通过 c.JSON() 方法,我们可以指定状态码和要响应的 JSON 数据,gin.H 是一个快捷的 map 类型,方便我们快速构建 JSON 响应内容。

文件响应

当需要响应文件时,Gin 也提供了简单易用的方法。

r.GET("/file", func(c *gin.Context) {c.File("./example.txt")
})

这里的 c.File() 方法直接将指定路径的文件响应给客户端。

HTML 响应

对于 HTML 页面的响应,Gin 同样有相应的方法。

r.LoadHTMLFiles("index.html") // 加载 HTML 模板文件r.GET("/html", func(c *gin.Context) {c.HTML(200, "index.html", gin.H{"title": "Gin HTML 响应示例",})
})

我们先通过 LoadHTMLFiles() 方法加载 HTML 模板文件,然后在路由处理函数中使用 c.HTML() 方法来渲染 HTML 页面,还可以将数据传递给模板进行动态展示。

重定向

重定向在 Web 开发中也经常用到,Gin 支持多种重定向方式。

r.GET("/redirect", func(c *gin.Context) {c.Redirect(302, "https://example.com")
})

上述代码实现了临时重定向,使用 c.Redirect() 方法指定重定向的状态码和目标 URL。

二、请求参数处理

查询参数

查询参数通常包含在 URL 的查询字符串中,我们可以通过 c.Query() 来获取单个查询参数,通过 c.DefaultQuery() 来获取带有默认值的查询参数。

r.GET("/query", func(c *gin.Context) {name := c.Query("name")age := c.DefaultQuery("age", "18")c.String(200, "name: %s, age: %s", name, age)
})

当我们访问 /query?name=John 时,输出为 name: John, age: 18

动态参数

动态参数可以定义在路由路径中,通过 :paramName 的形式指定,然后在处理函数中使用 c.Param() 获取。

r.GET("/user/:id", func(c *gin.Context) {id := c.Param("id")c.String(200, "User ID: %s", id)
})

当我们访问 /user/123 时,输出为 User ID: 123

表单参数

对于表单提交的数据,可以使用 c.PostForm() 来获取单个表单参数,使用 c.DefaultPostForm() 来获取带有默认值的表单参数。

r.POST("/form", func(c *gin.Context) {username := c.PostForm("username")password := c.DefaultPostForm("password", "123456")c.String(200, "Username: %s, Password: %s", username, password)
})

当表单提交包含 usernamepassword 字段时,就能正确获取并响应。

原始参数

对于原始的请求体数据,可以通过 c.Request.Body 来获取。

r.POST("/raw", func(c *gin.Context) {body, _ := ioutil.ReadAll(c.Request.Body)c.String(200, "Raw data: %s", body)
})

这样就能读取整个请求体的原始数据。

三、绑定参数

JSON 参数和 header 参数

Gin 支持使用绑定(binding)来将请求参数自动映射到结构体中。

type User struct {Username string `json:"username" binding:"required"`Password string `json:"password" binding:"required"`
}r.POST("/bind", func(c *gin.Context) {var user Userif err := c.ShouldBindJSON(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return}c.JSON(200, gin.H{"username": user.Username,"password": user.Password,})// 获取 header 参数authHeader := c.Request.Header.Get("Authorization")c.JSON(200, gin.H{"auth_header": authHeader})
})

ShouldBindJSON() 方法中,会根据结构体中的标签(如 jsonbinding)来解析 JSON 参数并进行验证。通过 c.Request.Header.Get() 可以获取请求头中的参数。

绑定内置规则

Gin 提供了一些内置的验证规则,如 required 表示字段是必填的,minmax 可以限制字段的长度等。

type Product struct {Name  string `json:"name" binding:"required"`Price uint   `json:"price" binding:"required,gt=0"`
}

这里对 Price 字段设置了 requiredgt=0(大于 0)的验证规则。

绑定错误信息

当绑定验证不通过时,Gin 会返回相应的错误信息,我们可以在处理函数中捕获并返回给客户端。

if err := c.ShouldBindJSON(&user); err != nil {c.JSON(400, gin.H{"error": err.Error()})return
}

会将详细的错误信息返回给客户端,告知哪些字段验证不通过及其原因。

定义验证器

我们还可以自定义验证器来满足特定的验证需求。

import "github.com/go-playground/validator/v10"func init() {validate := validator.New()validate.RegisterValidation("mycustom", func(fl validator.FieldLevel) bool {return fl.Field().String() == "custom"})
}type Custom struct {Value string `json:"value" binding:"mycustom"`
}

RegisterValidation() 方法中注册自定义的验证规则,然后在结构体标签中使用该规则。

四、路由

Gin 的路由使用简单直观,通过 GETPOST 等方法来定义不同 HTTP 方法的路由。

r.GET("/index", indexHandler)
r.POST("/submit", submitHandler)

我们还可以使用通配符路由来匹配多个路径。

r.GET("/files/*filepath", func(c *gin.Context) {filepath := c.Param("filepath")c.String(200, "File path: %s", filepath)
})

当访问 /files/images/avatar.png 时,filepathimages/avatar.png

五、中间件

局部中间件

局部中间件只对特定的路由或路由组生效。

authorized := func() gin.HandlerFunc {return func(c *gin.Context) {// 中间件逻辑c.Next()}
}r.GET("/protected", authorized(), func(c *gin.Context) {c.String(200, "Protected resource")
})

这里 authorized() 中间件只对 /protected 路由生效。

全局中间件

全局中间件对所有路由都生效。

logger := func() gin.HandlerFunc {return func(c *gin.Context) {// 中间件逻辑c.Next()}
}r.Use(logger())

通过 r.Use() 方法添加全局中间件,它会在每个请求处理前执行,可用于日志记录、请求验证等通用功能。

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

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

相关文章

Flink实时数仓数据突变时,如何快速排查原因

在大数据时代,数据的价值已经被无数企业和组织深刻认识到,而实时数仓作为数据处理和分析的重要基础设施,正在逐渐成为推动业务增长和决策优化的核心引擎。想象一下,电商平台在双十一大促期间需要实时监控订单量、用户行为,甚至库存变化,以便及时调整营销策略和物流调度;…

视频人像抠图技术选型--截止2025年4月

前言:我是一名算法工程师,经常需要对某个AI功能做技术调研和输出技术选型报告,在过去多年的工作当中,积累了很多内容,我会陆陆续续将这些内容整理出来分享给大家,希望大家喜欢,感谢您的阅读&…

docker compose ps 命令

docker compose ps 命令用于列出与 Docker Compose 项目相关的容器及其状态。 docker compose ps 能显示当前项目中所有服务容器的运行状态、端口映射等信息。 语法 docker compose ps [OPTIONS] [SERVICE…] SERVICE(可选):指定要查看状态…

C语言 字符函数和字符串函数(1)

目录 1.字符分类函数 2.字符转换函数 3.strlen的使用和模拟实现 4.strcpy的使用和模拟实现 在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提 供了一系列库函数,接下来我们就学习一下这…

MySQL 中如何进行 SQL 调优?

在MySQL中进行SQL调优是一个系统性工程,需结合索引优化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。以下是具体优化方法及案例说明: 一、索引优化:精准提速的关键 索引类型选择 普通索引:加速频繁查询的列&…

OpenCV图像金字塔详解:原理、实现与应用

一、什么是图像金字塔? 图像金字塔是图像处理中一种重要的多尺度表示方法,它通过对图像进行重复的平滑和降采样(或上采样)操作,生成一系列分辨率逐渐降低(或升高)的图像集合。这种结构形似金字…

收集飞花令碎片——C语言分支与循环语句(上)

前言 Hello,各位码友,本章将会给大家带来C语言的分支与循环整章串讲,这一张的内容分为基础知识和程序练习两个部分 希望通过这一章能够带大家更好地去掌握C语言的分支与循环语句 大家一起努力吧 C语言分支与循环语句(基础知识) C…

嵌入式硬件篇---TOF|PID

文章目录 前言1. 硬件准备主控芯片ToF模块1.VL53L0X2.TFmini 执行机构:电机舵机其他 2. 硬件连接(1) VL53L0X(IC接口)(2) TFmini(串口通信) 3. ToF模块初始化与数据读取(1) VL53L0X(基于HAL库)(…

PCB设计实践(十二)PCB设计电容选型:功能、材质、规则

在PCB设计中,电容作为基础元件承担着滤波、储能、去耦、耦合等核心功能。其分类与使用规则直接影响电路稳定性、抗干扰能力和信号完整性。本文从工程实践角度系统梳理PCB设计中电容的五大分类、选型规范及布局布线规则,帮助设计者构建科学的电容应用体系…

vue2关闭eslint

在项目根目录下找到 vue.config.js 文件。如果没有该文件,可以直接在项目根目录创建一个。 2. 添加 lintOnSave: false 配置 module.exports {lintOnSave: false };

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时,可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况,例如: 一个部门有多个员工一个订单有多个订单项一个博客有多个…

基于Stable Diffusion XL模型进行文本生成图像的训练

基于Stable Diffusion XL模型进行文本生成图像的训练 flyfish export MODEL_NAME"stabilityai/stable-diffusion-xl-base-1.0" export VAE_NAME"madebyollin/sdxl-vae-fp16-fix" export DATASET_NAME"lambdalabs/naruto-blip-captions"acceler…

基于React的高德地图api教程001:初始化地图

文章目录 1、初始化地图1.1 创建react项目1.2 可视化地图1.3 设置卫星地图1.4 添加开关开启3D地图1.5 代码下载1、初始化地图 1.1 创建react项目 创建geodeapi项目: npx create-react-app gaodeapi安装高德地图包: npm install @amap/amap-jsapi-loader1.2 可视化地图 在…

uniapp使用npm下载

uniapp的项目在使用HBuilder X创建时是不会有node_modules文件夹的,如下图所示: 但是uni-app不管基于哪个框架,它内部一定是有node.js的,否则没有办法去实现框架层面的一些东西,只是说它略微有点差异。具体差异表现在…

轻量在线工具箱系统源码 附教程

源码介绍 轻量在线工具箱系统源码,直接扔服务器 修改config/config.php文件里面的数据库 后台账号admin 密码admin123 本工具是AI写的 所以工具均是第三方接口直接写的。 需要加工具直接自己找接口写好扔到goju目录 后台自动读取 效果预览 源码获取 轻量在线工具箱系统源…

图解gpt之Seq2Seq架构与序列到序列模型

今天深入探讨如何构建更强大的序列到序列模型,特别是Seq2Seq架构。序列到序列模型,顾名思义,它的核心任务就是将一个序列映射到另一个序列。这个序列可以是文本,也可以是其他符号序列。最早,人们尝试用一个单一的RNN来…

mac M2能安装的虚拟机和linux系统系统

能适配MAC M2芯片的虚拟机下Linux系统的搭建全是深坑,目前网上的资料能搜到的都是错误的,自己整理并分享给坑友们~ 网上搜索到的推荐安装的改造过的centos7也无法进行yum操作,我这边建议安装centos8 VMware Fusion下载地址: htt…

「国产嵌入式仿真平台:高精度虚实融合如何终结Proteus时代?」——从教学实验到低空经济,揭秘新一代AI赋能的产业级教学工具

引言:从Proteus到国产平台的范式革新 在高校嵌入式实验教学中,仿真工具的选择直接影响学生的工程能力培养与创新思维发展。长期以来,Proteus作为经典工具占据主导地位,但其设计理念已难以满足现代复杂系统教学与国产化技术需求。…

【Linux】在Arm服务器源码编译onnxruntime-gpu的whl

服务器信息: aarch64架构 ubuntu20.04 nvidia T4卡 编译onnxruntime-gpu前置条件: 已经安装合适的cuda已经安装合适的cudnn已经安装合适的cmake 源码编译onnxruntime-gpu的步骤 1. 下载源码 git clone --recursive https://github.com/microsoft/o…

前端上传el-upload、原生input本地文件pdf格式(纯前端预览本地文件不走后端接口)

前端实现本地文件上传与预览(PDF格式展示)不走后端接口 实现步骤 第一步:文件选择 使用前端原生input上传本地文件,或者是el-upload组件实现文件选择功能,核心在于文件渲染处理。(input只不过可以自定义样…