[golang] gin mongodb restful api设计: 动态的patch接口

栏目: Go · 发布时间: 6年前

内容简介:Patch方法可以用来更新资源的一个组成部分当你仅需更新资源的某一项,即不完全也不幂等那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候,难道在patch的时候,或者专门写一个post的接口去一个一个if else操作吗,而我们又使用的是静态语言golang,有没有什么办法能够动态的让我们进行愉快的Patch呢?
  1. 什么是Patch?

Patch方法可以用来更新资源的一个组成部分

  1. 什么时候使用Patch?

当你仅需更新资源的某一项,即不完全也不幂等

那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候,难道在patch的时候,或者专门写一个post的接口去一个一个if else操作吗,而我们又使用的是静态语言golang,有没有什么办法能够动态的让我们进行愉快的Patch呢?

答案当然是有的,先说说如何去实现:

  1. 我们需要利用golang的map[string]interface{}结构
    • 我们需要一个动态的结构
    • 在mgo中大多使用map[string]interface{}的结构,我们直接构造出这个结构有利于我们直接进行Update({"$set": xxxx})操作
  2. 使用BindJSON函数,当然你也可以使用Gin的其他函数对map[string]interface{}进行绑定,这里我们不使用一个struct进行绑定,原因是我们无法判断客户端,或者说是浏览器会传送哪些字段来,这样做也有利于我们客户端将某一个字段置为默认值(如果用struct就只能避开默认值了)

来,开始贴代码:

// 这个是我们需要存到数据库中的Model
type Article struct {
    ID          bson.ObjectId `json:"id" bson:"_id" show:"id"`
    Author      string        `json:"author" bson:"author" show:"author"`
    Title       string        `json:"title" bson:"title" show:"title"`
    Content     string        `json:"content" bson:"content" show:"content"`
    Publish     int           `json:"publish" bson:"publish"`
    CreatedTime int64         `json:"created_time" bson:"created_time" show:"created_time"`
    ChangedTime int64         `json:"changed_time" bson:"changed_time" show:"changed_time"`
    PageView    int64         `json:"page_view" bson:"page_view" show:"page_view"` // 浏览量
    ArticleType string        `json:"article_type" bson:"article_type" show:"article_type"`
    ArticleTags []string      `json:"article_tags" bson:"article_tags" show:"article_tags"`
    Deleted     int           `json:"deleted" bson:"deleted"`
}

func ArticlePatch(c *gin.Context) {
    id := c.Query("id")
    if !bson.IsObjectIdHex(id) {
        err_msg := "参数错误"
        resp.SendFailJSON(c, err_msg)
        return
    }
    _id := bson.ObjectIdHex(id)
    if !CheckOwner(c) {
        err_msg := "您没有权限"
        resp.SendFailJSON(c, err_msg)
        return
    }
    mongo := model.GetModel(model.MongoArticleCollection)
    if mongo == nil {
        err_msg := "网络错误"
        resp.SendFailJSON(c, err_msg)
        return
    }
    article := &model.Article{}
    tags := common.GetAllTagValue(article, "json")
    query := bson.M{"_id": _id, "deleted": model.ModelNotDeleted}
    if !mongo.FindOne(article, query) {
        err_msg := "文章不存在"
        resp.SendFailJSON(c, err_msg)
        return
    }
    patchMap := map[string]interface{}{}
    err := c.BindJSON(&patchMap)
    if err != nil {
        err_msg := fmt.Sprint(err)
        resp.SendFailJSON(c, err_msg)
        return
    }
    deleteArray := []string{}
    for k, _ := range patchMap {
        ok, _ := common.InArray(k, tags)
        if !ok {
            deleteArray = append(deleteArray, k)
        }
    }
    deleteCount := len(deleteArray)
    fmt.Println("delete", deleteArray)
    for i := 0; i < deleteCount; i++ {
        delete(patchMap, deleteArray[i])
    }
    fmt.Println(patchMap)
    if !mongo.UpdateOne(query, bson.M{"$set": patchMap}) {
        err_msg := "更新失败"
        resp.SendFailJSON(c, err_msg)
        return
    }
    resp.SendSuccessJSON(c, "更新成功")
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Four

The Four

Scott Galloway / Portfolio / 2017-10-3 / USD 28.00

NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具