gin mongodb restful api設計: 動態的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, "更新成功")
    }
    
    


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM