第十四章 gin基础

发布于:2025-07-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

Gin快速搭建一个web服务

  1. 下载包
\\新建一个文件,文件名gitstudy,然后右击使用vscode打开,初始化目录,并下载包
go mod init ginstudy 
go get -u github.com/gin-gonic/gin
  1. 新建main.go
package main

import (
	"net/http"

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

func main() {
	//1. 创建一个路由引擎,之后可以在路由引擎中添加一些路由和路由处理逻辑
	r := gin.Default()
	//2. 添加路由到路由引擎,以及指定该路由的处理逻辑
	// GET("该路由的路径,处理该路由的逻辑")
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.GET("/", func(c *gin.Context) {
		//c.String
		//http.StatusOk, 就是状态码200,http这个包定义了相关状态码别名,直接调用就好
		c.String(http.StatusOK, "你在访问首页")
	})
	//3. 启动gin服务
	r.Run() // 默认监听8080,可以修改其他端口,r.Run(:8081)
}

Gin数据交互JSON串内容规范

  1. 用独立函数返回json串的写法
// 定义一个函数,用于gin处理相关请求的逻辑,并返回json数据
func getUserInfo(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{
		"name":    "马云",
		"age":     18,
		"address": "杭州",
	})
}

	//使用独立的函数处理逻辑
	r.GET("/api/user/info", getUserInfo)

浏览器访问
在这里插入图片描述

  1. 前后端分离时,返回j给前端json串常用的格式,这是相对标准的格式,可以给前端返回数据都按这个格式
	/*
		{
			"status": 200, //请求已经收到,后端处理返回给前端状态码,命名自定义code、statusCode
			"message": "查询成功"
			"data": {
				"name": "马云",
				"age": "18",
				"address": "杭州",
			}
		}
	*/

Gin使用结构体返回数据给前端

type UserInfo struct {
	Username string `json:"username"`
	Age      int    `json:"age"`
	Address  string `json:"address"`
}

type RetrunData struct {
	Status  int      `json:"status"`
	Message string   `json:"message"`
	Data    UserInfo `json:"data"`
}

func retrunDataWithStruct(c *gin.Context) {
	UserInfo := UserInfo{
		Username: "马云",
		Age:      18,
		Address:  "杭州",
	}
	RetrunData := RetrunData{
		Status:  200,
		Message: "用户信息查询",
		Data:    UserInfo,
	}
	c.JSON(http.StatusOK, RetrunData)
}


r.GET("/api/usr/infoWithSturct", retrunDataWithStruct)

Gin配置POST类型的路由

跟get配置基本一样,只是访问的需要postman使用post请求

func addUser(c *gin.Context) {
	RetrunData := RetrunData{
		Status:  200,
		Message: "创建成功",
	}
	c.JSON(http.StatusOK, RetrunData)
}


r.POST("/api/user/add", addUser)

在这里插入图片描述

Gin获取GET请求参数

参数是什么?就是url 问号后面的字段。?articleId=149418888,多个参数使用&符号分隔
例如:https://editor.csdn.net/md/?articleId=149418888&username=admin
1.配置接收参数

	//接受参数
	u := c.Query("username") 
	//u := c.DefaultQuery("username","小马")
	id, _ := strconv.Atoi(c.Query("id"))
	//去数据库中查询该用户信息
	fmt.Printf("拿到用户名:%s, ID:%d\n", u, id)
  1. 发送带参数请求
    在这里插入图片描述

  2. 查看参数是否已接收到
    在这里插入图片描述

Gin获取POST请求参数-form-data类型

// POST数据提交格式有两种:
// JSON {}
// from-data 表单,数据量比较小使用,两种方法都有用到

func addUser(c *gin.Context) {
	// POST获取请求参数
	//from-data获取请求参数
	u := c.PostForm("username")
	age, _ := strconv.Atoi(c.PostForm("age"))
	//address := c.PostForm("address")
	address := c.DefaultPostForm("address", "北京") //如果请求里没有这个key,就使用默认值,如果传有这个key就以你的配置为准

	UserInfo := UserInfo{
		Username: u,
		Age:      age,
		Address:  address,
	}
	RetrunData := RetrunData{
		Status:  200,
		Message: "创建成功",
		Data:    UserInfo,
	}
	c.JSON(http.StatusOK, RetrunData)
}

在这里插入图片描述

Gin获取POST请求参数-JSON类型

func addUserByJson(c *gin.Context) {
	// POST获取请求参数
	// JSON接受参数
	jsonData, _ := c.GetRawData()
	//拿到json串之后,也有两种处理。
	//1.转成一个map
	var m map[string]interface{}
	json.Unmarshal(jsonData, &m)
	c.JSON(http.StatusOK, m)

}

在这里插入图片描述

Gin获取参数绑定至结构体

//模型绑定
// 可以把请求的数据直接绑定到结构体  // 常用
// JSON接受参数,并且绑定到结构体

func addUserBindStuct(c *gin.Context) {
	UserInfo := UserInfo{}
	if err := c.ShouldBindJSON(&UserInfo); err != nil {
		// 说明绑定失败
		fmt.Println("数据绑定失败", err.Error())
		c.JSON(http.StatusOK, gin.H{
			"message": "参数格式不正确",
			"status":  500,
		})
	} else {
		c.JSON(http.StatusOK, UserInfo)
	}

}

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到