Gin 框架入门

news2025/5/13 17:41:43

Gin 框架入门

一、响应数据

JSON 响应

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

package main

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

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

相关文章

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性? 幂等性是指对一个系统进行重复调用(相同参数),无论同一操作执行多少次,这些请求…

软件设计师-错题笔记-系统开发与运行

1. 解析: A:模块是结构图的基本成分之一,用矩形表示 B:调用表示模块之间的调用关系,通过箭头等符号在结构图中体现 C:数据用于表示模块之间的传递的信息,在结构图中会涉及数据的流向等表示 …

C#简易Modbus从站仿真器

C#使用NModbus库,编写从站仿真器,支持Modbus TCP访问,支持多个从站地址和动态启用/停用从站(模拟离线),支持数据变化,可以很方便实现,最终效果如图所示。 项目采用.net framework 4.…

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 (1)候选框生成(Selective Search) (2)深度特征提取与微调 2.1 特征提取 2.2 网络微调(Fine-tuning) …

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…

一键解锁嵌入式UI开发——LVGL的“万能配方”

面对碎片化的嵌入式硬件生态,LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异,配合丰富的预置控件(如按钮、图表、滑动条)与动态渲染引擎,让工程师无需深入图形学原理,效率提升肉眼可见。 L…

智慧城市综合运营管理系统Axure原型

这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面,通过统一标准接入各类业务系统,实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心,为其提供一个直观、便捷、高效的协同服务平台…

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen(通义千问)智能体框架是阿里云推出的新一代AI智能体开发平台,其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计,将L…

可视化图解算法37:序列化二叉树-II

1. 题目 描述 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍…

C++GO语言微服务和服务发现②

01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令:micro new --type srv test66 框架默认自带服务发现:mdns。 使用consul服务发现: 1. 初始consul服务发现&…

【Web前端开发】CSS基础

2.CSS 2.1CSS概念 CSS是一组样式设置的规则,称为层叠样式表,用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制,实现美化页面的效果,也能够做到页面的样式和结构分离。 2.2基本语法 通常都是&#xff…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

一、工具简介 git commit --amend是Git版本控制系统的核心补救命令,主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录,而是通过覆盖原提交实现版本历史的整洁性,特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…

PTA:jmu-ds-最短路径

给定一个有向图&#xff0c;规定源点为0&#xff0c;求源点0到其他顶点最短路径。###你要实现的 函数接口定义&#xff1a; void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例&#xff1a; #include <stdio.h> #include <iostream> …

WEB UI自动化测试之Pytest框架学习

文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行&#xff08;推荐&#xff09;使用markers标记测试用例 pytest中添加Fixture&#xff08;测…

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时&#xff0c;开发者经常会在 Podfile 文件中看到一个配置选项&#xff1a;use_frameworks!。本文将详细介绍这个配置选项的含义&#xff0c;以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

矩阵置零算法讲解

矩阵置零算法讲解 一、问题描述 给定一个 (m \times n) 的矩阵,如果一个元素为 (0) ,则将其所在行和列的所有元素都设为 (0) 。要求使用原地算法,即在不使用额外矩阵空间的情况下完成操作。 二、解题思路 暴力解法 最直观的想法是遍历矩阵,当遇到 (0) 元素时,直接将其…

二本计算机,毕业=失业?

我嘞个豆&#xff0c;二本计算机&#xff0c;毕业即失业&#xff1f;&#xff01; 今天咱们聊聊普通院校计算机专业的学生未来的发展方向。有些话可能不太中听&#xff0c;但希望大家能理性看待。 首先得承认&#xff0c;对于普通双非和二本的学生来说&#xff0c;就业率加上…

[docker基础二]NameSpace隔离实战

目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1&#xff09;创建 Mount 隔离进程 2&#xff09;在新进程里边&#xff0c;创建空白文件&#…

Day22打卡-复习

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号人员生还预测https://www.kaggle.com/competitions/titanic/overview K…

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图)

uniapp + vue3 + 京东Nut动作面板组件:实现登录弹框组件(含代码、案例、小程序截图) 代码示下,不再赘述。 动作面板组件:https://nutui-uniapp.netlify.app/components/feedback/actionsheet.html 项目背景 业务需求 描述: uniapp + vue3 + 京东Nut框架:实现登录弹框组…