gin学习记录 - 2 | 青训营;

91 阅读3分钟

以文字资源为例学习四大请求方式

GET: 从服务器取出资源(一项或多项)

POST: 在服务器新建一个资源

PUT: 在服务器更新资源(客户端提供完整资源数据)

PATCH: 在服务器更新资源(客户端提供需要修改的资源数据)

DELETE: 从服务器删除资源

好像是五大请求方式... 不过没有用到PATCH

  • 以文字资源为例 分别对应增删改查
请求方式请求内容说明
GET/articles文章列表
GET/articles/:id文章详情
POST/articles添加文章
GET/articles/:id修改某一篇文章
GET/articles/:id删除某一篇文章

导入相应的包

package main

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
)

自定义需要的结构体

各个字段首字母大写表示可导出,然后在后面取别名即可

// ArticleModel 文章格式  简单写
type ArticleModel struct {
	Title   string `json:"title"`
	Content string `json:"content"`
}

// 封装响应格式
type Response struct {
	Code    int    `json:"code"`
	Date    any    `json:"date"`
	Message string `json:"msg"`
}

文章列表

func _getList(arg *gin.Context) {
	list := []ArticleModel{
		{"go语言入门", "本书是go语言入门基础"},
		{"c语言入门到入土", "本书是c语言入门教程,面向入土"},
		{"数据库从删库到跑路", "本书教你如何从删库到跑路"},
	}
	// 返回的Response的code是随便写的,实际应该定义一些有意义的响应码
	arg.JSON(200, Response{http.StatusOK, list, "响应成功"})
}
  • postman响应截图:
  • 文章列表

文章详情

func _getDetails(arg *gin.Context) {
	// 简写 实际应根据获取的id到数据库中查询
	book_id := arg.Param("id")
	fmt.Printf("获取到id: %v\n", book_id)
	// 此处直接得到查询数据库的结果
	article := ArticleModel{
		"c语言入门到入土", "本书是c语言入门教程,面向入土",
	}

	arg.JSON(http.StatusOK, gin.H{"id": book_id, "response": Response{http.StatusOK, article, "响应成功"}})
}
  • postman响应截图: 文章详情

创建文章 和 修改文章

这俩放一起了,因为用到同一个函数

类型对应的结果
jsonapplication/json
from-datamultipart/form-data; boundary=--------------------------629880651178044255286053
x-www-form-urlencodedapplication/x-www-form-urlencoded

根据以上获取请求头类型可以判断并解析json数据,不同类型的数据用不同的处理方式

// 封装的一个处理json数据的函数
func _bindJson(arg *gin.Context, obj any) (err error) {
	body, _ := arg.GetRawData() // 获取到post传的数据

	contentType := arg.GetHeader("Content-Type")

	fmt.Println(string(contentType)) // 内容类型
	
	switch contentType {
	case "application/json": // 简写,这里就只解析json数据

		// 将post的数据反序列化解析成结构体
		err := json.Unmarshal(body, &obj)
		if err != nil {
			fmt.Println(err)
			return err
		}
	default:
		fmt.Println(":D")
	}
	return nil
}

// 创建文章
func _post(arg *gin.Context) {
	var article ArticleModel

	err := _bindJson(arg, &article)
	if err != nil {
		panic(err)
	}

	arg.JSON(http.StatusOK, Response{http.StatusOK, article, "创建成功"})
}

// 修改文章
func _put(arg *gin.Context) {
	// 拿到id
	fmt.Printf("获取到id: %v\n", arg.Param("id"))

	var article ArticleModel
	// 拿到修改后的文章内容
	err := _bindJson(arg, &article)
	if err != nil {
		panic(err)
	}

	arg.JSON(200, Response{http.StatusOK, article, "修改成功"})
}
  • postman响应截图:

  • 创建文章 创建文章

  • 修改文章

  • 修改文章


删除文章

思路也同样的是拿到id,然后根据id删除对应文章,实际开发中,拿到id要去数据库中查找、删除 ...

func _delete(arg *gin.Context) {
	fmt.Printf("获取到id: %v\n", arg.Param("id"))
	arg.JSON(200, Response{http.StatusOK, "", "删除成功"})
}
  • postman响应截图:
  • 删除文章 删除文章

删除后只需要返回一个删除成功的提示,没别的东西,所以很空,实际开发还需要对数据库进行操作...


main函数

定义GET,POST,PUT和DELETE请求类型

func main() {
	router := gin.Default()
	router.GET("/articles/", _getList)
	router.GET("/articles/:id", _getDetails)
	router.POST("/articles/", _post)
	router.PUT("/articles/:id", _put)
	router.DELETE("/articles/:id", _delete)

	err := router.Run(":80")
	if err != nil {
		return
	}
}

写在最后

文章引自个人博客,担心被认为引流,这里就不放博客链接了~

over~