gin学习记录-四大请求方式

写在前面

辉夜酱

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

GET: 从服务器取出资源(一项或多项)
POST: 在服务器新建一个资源
PUT: 在服务器更新资源(客户端提供完整资源数据)
PATCH: 在服务器更新资源(客户端提供需要修改的资源数据)
DELETE: 从服务器删除资源

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

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

导入相应的包

1
2
3
4
5
6
7
8
package main

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

自定义需要的结构体

1
2
3
4
5
6
7
8
9
10
11
12
// 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"`
}

文章列表

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

文章详情

1
2
3
4
5
6
7
8
9
10
11
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响应截图:
    文章详情

创建文章 和 修改文章

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// 封装的一个处理json数据的函数
func _bindJson(arg *gin.Context, obj any) (err error) {
body, _ := arg.GetRawData() // 获取到post传的数据

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

fmt.Println(string(contentType)) // 内容类型
// 类型 对应的结果
// json: application/json
// from-data: multipart/form-data; boundary=--------------------------629880651178044255286053
// x-www-form-urlencoded: application/x-www-form-urlencoded

// 根据以上可以这也判断并解析json数据 不同类型的数据用不同的处理方式
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响应截图:

  • 创建文章
    创建文章

  • 修改文章

  • 修改文章


删除文章

1
2
3
4
5
6
7
8
func _delete(arg *gin.Context) {
// 拿到id
fmt.Printf("获取到id: %v\n", arg.Param("id"))
// 实际中 拿到id然后去数据库中查找、删除 ...

arg.JSON(200, Response{http.StatusOK, "", "删除成功"})

}
  • postman响应截图:
  • 删除文章
    删除文章

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


main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
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~


gin学习记录-四大请求方式
https://kjasn.github.io/2023/08/04/gin-学习记录-四大请求方式/
作者
Kjasn
发布于
2023年8月4日
许可协议