此章节代码仅仅表示restful风格的四大请求方式
Restful风格指的是网络应用中资源定位和资源操作的风格,不是标准也不是协议。
1.四大请求方式
(1)GET: 从服务器取出资源(一项或者多项) ,例如文件下载、返回数据等
(2)POST: 在服务器新建一个资源,例如新建一个数据到服务器上
(3)PUT: 在服务器更新资源(客户端提供完整资源数据),例如修改数据
(4)DELETE: 从服务器删除资源,例如删除数据
2.以文章资源为例子
//实际上公司中接口操作会更复杂,前端操作的参数会很多,以及权限的验证
//创建文章结构体
type Article struct {
Title string `json:"title"`
Content string `json:"content"`
}
// 封装接口规范
type Response struct {
Code int `json:"code"`
Data any `json:"data"`
Message string `json:"message"`
}
// 文章列表(一般只拿query参数)
func _getlist(context *gin.Context) {
//其实除以下功能还包含搜索、分页功能
//构造一个微型模拟数据库
artileList := []Article{
{Title: "book1", Content: "test1"},
{Title: "book2", Content: "test2"},
{Title: "book3", Content: "test3"},
}
//规范接口写法
context.JSON(200, Response{
Code: 0,
Data: artileList,
Message: "成功",
})
}
// 文章详情
func _getdetail(context *gin.Context) {
//获取param参数中的id(动态参数),正常来讲是获取数据库内的数据,但目前没学到那个地步
//构造一个微型模拟数据库 ↓举例为用户在数据库中搜索到的数据
artile := []Article{
{Title: "book0", Content: "test0"},
}
fmt.Println(context.Param("id"))
context.JSON(200, Response{
Code: 0,
Data: artile,
Message: "查询成功",
})
}
// 下面三个接口就涉及到了用户传递过来的数据
// 创建文章
func _create(context *gin.Context) {
//接收前端传递过来的数据
var article Article
//如果解析JSON数据失败,则打印报错并结束此段程序
err := _bindJson(context, &article)
if err != nil {
fmt.Println(err)
return
}
//解析数据成功
context.JSON(200, Response{
Code: 0,
Data: article,
Message: "添加成功",
})
}
// 编辑文章
func _updata(context *gin.Context) {
fmt.Println(context.Param("id")) //根据id找原来的数据,再在数据库中对该id的数据进行修改
var article Article
err := _bindJson(context, &article)
if err != nil {
fmt.Println(err)
return
}
context.JSON(200, Response{
Code: 0,
Data: article,
Message: "修改成功",
})
}
// 删除文章
func _delete(context *gin.Context) {
fmt.Println(context.Param("id"))
context.JSON(200, Response{
Code: 0,
Data: nil,
//Data: map[string]string{}, ←这种写法进行删除也行
Message: "删除成功",
})
}
// 封装json结构体解析
func _bindJson(context *gin.Context, obj any) (err error) {
body, _ := context.GetRawData()
contentType := context.GetHeader("Content-Type")
//form-data、x-www-form-urlencoded和json都分别对应了它们各自的type
fmt.Println(contentType) //打印出type类型进行观察
switch contentType {
case "application/json": //只有为json类型数据post时才能接收到数据
//解析json结构体
err := json.Unmarshal(body, &obj) //会返回以一个err判断是否解析成功 按类型解析,例如上面的User结构体中Name的json tag从name变成了name1,而apipost过去的是name,则不能解析。
if err != nil {
fmt.Println(err.Error())
return err
}
}
return nil
}
func main() {
// GET /articles ←访问它为文章列表(复数形式) 查
// GET /articles/:id ←文章详情 查
// POST /articles ←添加文章 增
// PUT /articles/:id ←修改某一篇文章 改
// DELETE /articles/:id ←删除某一篇文章 删
//但这些请求依旧局限,例如批量删除,要把批量的id以json的形式传过去,但添加时,则可能还会传别的东西过去。
router := gin.Default()
router.GET("/articles", _getlist) //获取文章列表
router.GET("/articles/:id", _getdetail) //获取文章详情
router.POST("/articles", _create) //添加文章
router.PUT("/articles/:id", _updata) //编辑文章
router.DELETE("/articles/:id", _delete) //删除文章
//以上这三个增、删、改是简略版,实际上要复杂一些
router.Run(":80")
}
评论(0)