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.pswp.cn/bicheng/80775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80775.shtml
英文地址,請注明出處:http://en.pswp.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只不過可以自定義樣…