以文字资源为例学习四大请求方式
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响应截图:
创建文章 和 修改文章
这俩放一起了,因为用到同一个函数
| 类型 | 对应的结果 |
|---|---|
| json | application/json |
| from-data | multipart/form-data; boundary=--------------------------629880651178044255286053 |
| x-www-form-urlencoded | application/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~