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

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

内容简介: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, "更新成功")
}

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

查看所有标签

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

Practical JavaScript, DOM Scripting and Ajax Projects

Practical JavaScript, DOM Scripting and Ajax Projects

Frank Zammetti / Apress / April 16, 2007 / $44.99

http://www.amazon.com/exec/obidos/tg/detail/-/1590598164/ Book Description Practical JavaScript, DOM, and Ajax Projects is ideal for web developers already experienced in JavaScript who want to ......一起来看看 《Practical JavaScript, DOM Scripting and Ajax Projects》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具