G

[Golang]Gin框架 4.四大请求方式

RoLingG 2023-06-12

此章节代码仅仅表示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")
}
PREV
[Golang]Gin框架 2.响应
NEXT
[Golang]Gin框架 3.查询参数

评论(0)

发布评论