gin mongodb restful api设计: 动态的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, "更新成功")
}
gin mongodb restful api设计: 动态的patch接口的更多相关文章
- RESTful API 设计指南 (转)
RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- RESTful API设计概要
一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...
- Rest Framework简介 和 RESTful API 设计指南
使用Django Rest Framework之前我们要先知道,它是什么,能干什么用? Django Rest Framework 是一个强大且灵活的工具包,用以构建Web API 为什么要使用Res ...
- 微服务指南走北(三):Restful API 设计简述
API的定义取决于选择的IPC通信方式,假设是消息机制(如 AMQP 或者 STOMP).API则由消息频道(channel)和消息类型.假设是使用HTTP机制,则是基于请求/响应(调用http的ur ...
- RESTful API设计原则与规范
RESTful API设计原则与规范 一.背景与基础概念 2 二.RESTful API应遵循的原则 3 1.协议(Protocol) 3 2.域名(ROOT URL) 3 3.版本(Versioni ...
- RESTful API 设计总结
RESTful API 设计总结 @(技术-架构)[API, 规范, 设计] RESTful的接口设计风格应用的越来越广泛,包括Spring Cloud等微服务架构平台之间的调用都是以RESTful设 ...
- RESTful API设计的点
RESTful API 前言 一直在使用RESTful API,但是好像概念还是很模糊的,总结下使用到的点 设计的规范 协议 API与用户的通信协议,总是使用HTTPs协议. 域名 应该尽量将API部 ...
- 理解RESTful架构——Restful API设计指南
理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...
随机推荐
- 在使用avalon框架的时候,用ms-duplex双工绑定,在template上是有数据渲染的,但是js里面却是undefined
controller绑定是用于圈定某个VM的作用域范围,因为有的页面,你用的对象一致,而这两个作用域里面有相同的数据,那么很有可能是另一个作用域里面的东西影响了这个作用域,所以在指定作用域的给不同的命 ...
- TCP/IP 这猝不及防的爱情
前言 前几天看了老刘的一篇文章,TCP/IP 大明邮差.正好最近也在读<计算机自顶向下>一书 心血来潮,想写一个女版的TCP/IP 正文 一天,我正在百花会上赏花,赏着赏着,就出现了一个令 ...
- x2goserver 连接问题
The remote proxy closed the connection while negotiating the session. This may be due to the wrong a ...
- STL算法之find
定义 template <class InputIterator, class T> InputIterator find (InputIterator first, InputItera ...
- Go 语言入门(二)方法和接口
写在前面 在学习 Go 语言之前,我自己是有一定的 Java 和 C++ 基础的,这篇文章主要是基于A tour of Go编写的,主要是希望记录一下自己的学习历程,加深自己的理解 Go 语言入门(二 ...
- LayUI使用弹窗重载父级数据表格的两种方法
参考LayUI官方文档,在子窗口中重载父级数据表格找到以下两种方法: 1.子窗口中重载:在子窗口中直接调用父级talbe的reload方法. $("body").on(" ...
- c#添加资源
1.在项目目录下创建Resources文件夹,把需要用到的图片放到此文件夹里 2.在项目属性-资源里面添加这些图片 此时就可以在项目里看到资源文件夹及其下的图片了 3.在代码里这样使用这些图片: Im ...
- C语言练习,可以解析协议,主机,路径,询问,片段等
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- Cisco Port-Channel 设置(链路聚合--重点)
Port-Channel 的在实际工作中的主要作用是将两个或多个端口捆绑成为一个虚拟通道. interface Port-channel1 description port(1/0/5-6) swit ...
- WCAG
WCAG What is WCAG? Web Content Accessibility Guidelines (WCAG) Overview Checklist and solve technolo ...