内容简介:Patch方法可以用来更新资源的一个组成部分当你仅需更新资源的某一项,即不完全也不幂等那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候,难道在patch的时候,或者专门写一个post的接口去一个一个if else操作吗,而我们又使用的是静态语言golang,有没有什么办法能够动态的让我们进行愉快的Patch呢?
- 什么是Patch?
Patch方法可以用来更新资源的一个组成部分
- 什么时候使用Patch?
当你仅需更新资源的某一项,即不完全也不幂等
那当我们的模型在数据库中几乎每个字段都可能会遇到改变的时候,难道在patch的时候,或者专门写一个post的接口去一个一个if else操作吗,而我们又使用的是静态语言golang,有没有什么办法能够动态的让我们进行愉快的Patch呢?
答案当然是有的,先说说如何去实现:
-
我们需要利用golang的map[string]interface{}结构
- 我们需要一个动态的结构
- 在mgo中大多使用map[string]interface{}的结构,我们直接构造出这个结构有利于我们直接进行Update({"$set": xxxx})操作
- 使用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, "更新成功") }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- C#动态调用WCF接口
- 编程接口的新动态:用 TensorFlow 高层 API 来构建机器学习模型 丨 Google 开发者大会 2018
- .net core3.1 abp动态菜单和动态权限(动态菜单实现和动态权限添加) (三)
- 接口测试及常用接口测试工具
- Java中的Comparable接口和Comparator接口
- Java 的 Closeable 接口和 Cloneable 接口
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。