【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")
	}
}
相关推荐
xiAo_Ju28 分钟前
Xcode 26 Debug view hierarchy 不显示隐藏视图问题
xcode
游戏开发爱好者82 小时前
抓包工具有哪些?代理抓包、数据流抓包、拦截转发工具
android·ios·小程序·https·uni-app·iphone·webview
bybitq4 小时前
Go函数闭包实战-复用函数
ios·golang·xcode
ChineHe6 小时前
Gin框架基础篇002_获取/绑定请求参数
后端·golang·gin
码界奇点8 小时前
基于Gin+Vue的前后端分离权限管理系统设计与实现
前端·vue.js·车载系统·毕业设计·gin·源代码管理
00后程序员张8 小时前
混合 App 怎么加密?分析混合架构下常见的安全风险
android·安全·小程序·https·uni-app·iphone·webview
Digitally9 小时前
3种简单方法备份 iPhone 短信
ios·iphone
2501_915921439 小时前
Flutter App 到底该怎么测试?如何在 iOS 上进行测试
android·flutter·ios·小程序·uni-app·cocoa·iphone
2501_9159090610 小时前
如何在 Windows 上上架 iOS App,分析上架流程哪些是不用mac的
android·macos·ios·小程序·uni-app·iphone·webview
TheNextByte110 小时前
如何用 5 种简单方法抹掉 iPhone 上的密码?
ios·iphone