首页 技术 正文
技术 2022年11月20日
0 收藏 520 点赞 4,635 浏览 2234 个字

目录

  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, "更新成功")
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297