首页 > 其他分享 >Go web中修改操作需要注意的一点

Go web中修改操作需要注意的一点

时间:2023-02-06 13:22:05浏览次数:53  
标签:status web http err 修改 Go todo id row

不仅是Gin框架,曾经在http库中也遇到过类似的问题,所以进行详细的分析!

定位到前端代码:bubble_frontend/TodoList.vue at master · Q1mi/bubble_frontend (github.com)

handleEdit(index, row) {
  let messageSuffix = row.status ? " 置为未完成" : " 置为已完成";
  this.axios
    .put("/v1/todo/" + row.id, {
      status: !row.status
    })
    .then(() => {
      this.tableData[index].status = !row.status;
      this.$message({
        showClose: true,
        duration: 1500,
        message: `<${row.title}> ${messageSuffix}`,
        type: "success"
      });
    });
},

status为bool类型。

可以清楚的看到,前端向/v1/todo/:id发送了PUT请求,并且发送了!status

同时可以在服务器端,截取到完整的请求信息来验证,这里参考了:Gin 框架优雅的获取所有的请求参数 | 热浪编程 (pudongping.com)

pScQLuj.png

// 修改某一个待办事项
		v1Group.PUT("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
				return
			}
			var todo Todo
			if err = DB.Where("id=?", id).First(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
				return
			}
      // 此时的todo是从数据库取出的:{ID:1 Title:吃饭 Status:false}
			c.BindJSON(&todo) // 这一步,c中有前端传来的{"status":true};
			if err = DB.Save(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			} else {
				c.JSON(http.StatusOK, todo)
			}
		})

疑问{ID:1 Title:吃饭 Status:false} 经过 c.BindJSON(&todo) 之后,就修改为 {ID:1 Title:吃饭 Status:true}

  • c中只有前端传来的{"status":true},Todo结构体的部分成员变量。

经过对c.BindJSON(&todo)的源码分析,最终发现核心起作用的是关于json.Decoder,并对其做出如下模拟:

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	str := `{"age":18}`                   // 模拟前端传来的某条参数;
	person := Person{Name: "老六", Age: 27} // 模拟数据库中已有的记录;
	err := json.NewDecoder(strings.NewReader(str)).Decode(&person)
	if err == nil {
		fmt.Printf("解码结果: %+v", person)
	} // 解码结果: {Name:老六 Age:18}
}

总结:对于Go语言常见的库,应该扎实掌握!

标签:status,web,http,err,修改,Go,todo,id,row
From: https://www.cnblogs.com/kphang/p/17095111.html

相关文章

  • Eclipse笔记-如何修改web项目的web module version
    有时候我们想改变web项目的webmoduleversion,比如说原本是2.4版本,我们想改成3.0版本,通过右键项目名->Properties->ProjectFacets,选中DynamicWebModule后边的版本,将2......
  • web之php一句话木马总结------2023.2.6
    一句话木马的原理<?php@eval($_POST['shell']);?>这是php的一句话后门中最普遍的一种。它的工作原理是:首先存在一个名为shell的变量,shell的取值为HTTP的POST方式。Web......
  • web之命令执行常见函数------2023.2.6
     system()函数作用:将字符串作为OS命令执行,自带输出功能。格式:stringsystem(string$command[,int&$return_var])//$command为执行的命令,&return_var可选,用来......
  • 解决智慧城市发展困扰:Web 3D 智慧环卫 GIS 系统
    前言智慧环卫,依托物联网技术与移动互联网技术,对环卫管理所涉及到的人、车、物、事进行全过程实时管理,合理设计规划环卫管理模式,提升环卫作业质量,降低环卫运营成本,用数字......
  • 基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控
    前言智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注。目前智慧楼宇可视化监控的主要优点包括:智......
  • 基于 WebGL 3D 的 HTML5 档案馆可视化管理系统
    前言档案管理系统是通过建立统一的标准以规范整个文件管理,包括规范各业务系统的文件管理的完整的档案资源信息共享服务平台,主要实现档案流水化采集功能。为企事业单位的档案......
  • 基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
    前言智慧楼宇和人们的生活息息相关,楼宇智能化程度的提高,会极大程度的改善人们的生活品质,在当前工业互联网大背景下受到很大关注。目前智慧楼宇可视化监控的主要优点包括:智......
  • 基于Sovit3D可视平台的Web3D智慧电网系统
    十四五规划提出:“加快推动数字产业化,培育壮大人工智能、大数据、区块链、云计算、网络安全等新兴数字产业”,这是深化电网领域以新能源为主体的国家新型电力系统战略。建设背......
  • php修改word的实例方法
    将Word另存为网页。修改为默认页面视图。编写PHP代码。通过fwrite等函数修改Word内容即可。实例ob_start();//开启缓存print'';//输出头部$content=file_get_c......
  • 基于Sovit3D可视平台的Web3D智慧电网系统
    十四五规划提出:“加快推动数字产业化,培育壮大人工智能、大数据、区块链、云计算、网络安全等新兴数字产业”,这是深化电网领域以新能源为主体的国家新型电力系统战略。......