【gin框架读取参数的方式】

gin框架读取参数的方式

go 复制代码
package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
)

// 定义结构体

type Book struct {
	Name   string `json:"name"`
	Author string `json:"author"`
}

func main() {
	// 创建默认的gin路由引擎
	server := gin.Default()

	// 创建业务路由 并返回数据
	server.GET("/api/hello", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"code":    0,
			"message": "Hello World",
			"data":    nil,
		})
	})

	// gin框架读取参数

	/*
			1 读取url路径参数
			/ api/books/:name
			server.GET("/api/books/:name/:year/:month", func(c *gin.Context) {})

			请求
			curl --location --request GET 'http://127.0.0.1:18080/api/books/testBook'
			返回
			{
		    	"code": 0,
		    	"data": null,
		    	"message": "testBook"
			}
	*/
	// 接口示例
	server.GET("/api/books/:name", func(c *gin.Context) {
		// c.Param 读取参数
		name := c.Param("name")
		// 返回JSON数据
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": name,
			"data":    nil,
		})
	})

	/*
			2 读取url 查询参数
			/api/books?pageSize=10&pageNum=1

			请求
			curl --location --request GET 'http://127.0.0.1:18080/api/books?pageSize=1000&pageNum=10'
			返回
			{
		    	"code": 0,
		    	"data": null,
		    	"message": "pageSize=1000&pageNum=10"
			}
	*/
	// 接口示例
	server.GET("/api/books", func(c *gin.Context) {
		ps := c.Query("pageSize")
		pn := c.Query("pageNum")
		returnData := fmt.Sprintf("pageSize=%s&pageNum=%s", ps, pn)
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": returnData,
			"data":    nil,
		})
	})

	/*
		3 读取header参数
		常用于接口认证 Authorization Bearer xxxxxxx

		请求
		curl --location --request GET 'http://127.0.0.1:18080/api/bookAuth'  --header 'Authorization: Bearer test_token'
		返回
		{
			"code": 0,
			"data": null,
			"message": "Bearer test_token"
		}

	*/
	// 接口示例
	server.GET("/api/bookAuth", func(c *gin.Context) {
		auth := c.GetHeader("Authorization")
		c.JSON(http.StatusOK, gin.H{
			"code":    0,
			"message": auth,
			"data":    nil,
		})
	})

	/*
				4 body中读取参数 推荐ShouldBindJson
				一般用于提交数据 POST请求 或者 PUT 等
				{"name":"初始Go语言","author":"XiaoLx005"}
				JSON -- struct
				// 请求
				curl --location --request POST 'http://127.0.0.1:18080/api/books' --header 'Content-Type: application/json' \
					--data-raw '{
			   		 "name":"初始Go语言",
			   		 "author":123
				}'
				// 返回
				{
		    		"code": 1,
		    		"data": null,
		    		"message": "json: cannot unmarshal number into Go struct field Book.author of type string"
				}

				ShouldBindJSON和BindJSON的区别以及使用场景

				ShouldBindJSON:
				绑定 JSON 数据时,如果出现错误(例如 JSON 数据格式不符合预期、类型不匹配等),
				它不会直接返回 HTTP 错误响应。而是返回一个错误值,由开发者决定如何处理这个错误。例如:
				if err := c.ShouldBindJSON(&user); err!= nil {
					c.JSON(400, gin.H{"error": err.Error()})
					return
				}
				适用于需要对错误进行详细记录、自定义错误处理逻辑(比如根据不同的错误类型返回不同的状态码或消息)的情况。
				例如,在一个复杂的微服务架构中,可能需要将错误信息发送到专门的错误收集服务进行分析,此时ShouldBindJSON就很有用。

				BindJSON:
				绑定 JSON 数据出现错误,它会自动返回一个状态码为 400(Bad Request)的响应给客户端,
				并且在响应体中包含了错误信息。例如:
				if err!= nil {
					// 这里不需要手动返回错误响应,因为BindJSON已经自动返回了
					return
				}
				适用于简单的 API 场景,对于错误处理要求不高,只需要快速返回一个基本的错误提示给客户端的情况。
				例如,一个小型的内部工具的 API,主要关注功能实现,对于错误处理只要符合常见的 HTTP 规范(返回 400 错误)就足够了。

	*/
	// 接口示例 结构体定义在函数外

	server.POST("/api/books", func(c *gin.Context) {
		// 定义变量 为Book struct
		//var book Book
		book := new(Book)
		// c.ShouldBindJSON 将上下文接收的数据 绑定 结构体数据
		err := c.ShouldBindJSON(&book)
		if err != nil {
			c.JSON(http.StatusBadRequest, gin.H{
				"code":    1,
				"message": err.Error(),
				"data":    nil,
			})
		} else {
			c.JSON(http.StatusOK, gin.H{

				"code":    0,
				"message": "success",
				"data":    nil,
			})
		}
	})

	// 启动服务 指定端口
	err := server.Run(":18080")
	// 错误处理
	if err != nil {
		panic(err)
	} else {
		log.Println("Server started")
	}
}
相关推荐
Digitally3 小时前
删除iCloud中的照片但保留iPhone上的照片的两种方法
ios·iphone·icloud
00后程序员张4 小时前
iOS App 混淆实战,在源码不可用情况下的成品加固与测试流程
android·ios·小程序·https·uni-app·iphone·webview
运维行者_5 小时前
OpManager 与 iOS 26:开启 IT 运维新时代
运维·网络·网络协议·网络安全·ios·iphone·告警
2501_916013748 小时前
iOS 26 设备文件管理实战指南,文件访问、沙盒导出、系统变更与 uni-app 项目适配
android·ios·小程序·uni-app·cocoa·iphone·webview
2501_915921438 小时前
前端用什么开发工具?常用前端开发工具推荐与不同阶段的选择指南
android·前端·ios·小程序·uni-app·iphone·webview
2501_916007479 小时前
iOS 26 能耗检测实战指南,升级后电池掉速是否正常 + KeyMob + Instruments 实时监控 + 优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
2501_916013749 小时前
苹果上架 App 全流程详解,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 测试与 App Store 审核经验
android·ios·小程序·https·uni-app·iphone·webview
2501_915909069 小时前
HTML 开发工具有哪些?常用 HTML 开发工具推荐、学习路线与实战经验分享
android·小程序·https·uni-app·iphone·webview
2501_916007471 天前
Java界面开发工具有哪些?常用Java GUI开发工具推荐、实战经验与对比分享
android·java·开发语言·ios·小程序·uni-app·iphone