Beego框架 POST请求接口编写

Beego框架 POST请求接口编写,第1张

目录 数据库建表Beego自动生成代码commentsRouter_controllers.go不自动生成 注释参数过滤POST代码

数据库建表

因为业务需求需要建立两张数据库表,同事说我开始建的表有问题,每张表都需要添加一个ID号,那么以后排序,以及数据量大进行查询跳转的时候也不会那么卡。

两表链接我当时想用IMEI号来链接,因为IMEI号跟设备绑定并且唯一,同事跟我说每个imei15个字符,太长了,占用的空间肯定大,所以使用了id

测试设备表(test_device)

测试数据表(test_data)

Beego自动生成代码

手册中找到的,注意level等级最好为2,如果为3的话会把原来的路由删除

eg:(该例子的数据库是本地数据库跟上面的表无关,所以表名不同)
bee generate appcode -tables=“users” -driver=mysql -conn=“root:root@tcp(127.0.0.1:3306)/test” -level=2

bee generate appcode -tables=“表名” -driver=使用的数据库 -conn=“用户:密码@tcp(IP:3306)/数据库名” -level=2

生成完后,记得把文件名的下划线啥的去掉,使用驼峰命名法(这属于是规范问题)
例如test_device.go 换成testDevice.go

后续自己添加路由!

两张表生成会有两个Controller,两个models,只需要一个Controller即可

commentsRouter_controllers.go不自动生成

数据库创建完表后发现用bee工具自动化生成代码的时候报了一个错

我看了下同事写的其他接口,不是这个包名是beeapi这个名字然后我换成了beeapi就没问题可以运行

后续发现怎么都访问不到数据库数据,一直404,我开始想着是router没有配置。看了看配置了,然后我就想到了 commentsRouter_controllers.go 文件,看了下没有自动生成。

查了很多资料,都说是配置文件要dev啥的还有一个github上的一个不在GOPATH路径的,都解决不了这个问题
https://github.com/beego/bee/issues/643
https://blog.csdn.net/weixin_41760738/article/details/119136340

我项目是在GOPATH目录下新建了个src文件夹,将项目存放在src文件夹中
bee run后并没有警告报错,但是就是不是生成文件

我想了想会不会是beeapi这个包名问题,全改了发现也生成不了文件

注意:beego框架添加完注释路由在router目录下会自动生成commentsRouter_controllers.go文件,如果没自动生成,需要手动添加,这个属于beego框架的问题,我前两天查了一天没查出来,我同事也查了好久说beego把这个问题修复了但没更新

注释

go语言是可以添加注释的也就是tag
在models文件中给结构体每个参数添加JSON注释,目的表示这个变量在JSON里面使用另一个名字

DevGetJsonData后面注释orm:"-"是省略了映射关系,否则会报错

这里添加了valid过滤,如何使用看下面代码,目的是为了防止用户输入空字符或者全是空格,但是如果数据是“ 1” 或者 “1 ”都是可以的。

参数过滤

header是请求头,前面Bearer是JWT里默认添加的,后面就是TOKEN
Authorization 是请求头名

下面是我需要POST请求的

{
    "dev_imei": "111111111111111",
    "dev_producer": "Manufacturer Name",
    "dev_producer_name": "smart_city_cover",
    "dev_producer_time": "2022-03-06T00:00:00+08:00",
    "dev_test_result": "Pass",
    "dev_test_time": "2022-03-07T17:11:18+08:00",
    "dev_tester": "root",
    "dev_tester_jobnum": "rg45",
    "data":[
        {
            "devdata_test_data": "iu",
            "devdata_test_item": "fwse",
        },
        {
            "devdata_test_data": "asd",
            "devdata_test_item": "dfhg",
        }
    ]
}

那么就会遇到一个问题,第二层表的数据无法valid过滤
所以我自己写了个过滤函数,仿写valid(为空或全空格报错)
当时我的思路是为空的话len求长度就为0,但是全是空格的话我想的是根据长度动态生成字符串然后进行比对,想了想比较麻烦以及难实现。

这时同事给了我另一个思路把字符串为空格的去除再求长度

func CheckTestData(data string) int8 {
	lenData := len(data)
	if lenData == 0 {
		return -1
	} else {
		trimStr := strings.Trim(data, " ")
		if len(trimStr) == 0 {
			return -2
		}
	}

	return 0
}
POST代码

TestDeviceDataController是map类型的,有两个字段
分别是Routerpattern存放路由地址
还有个是JSON存放JSON数据的

// Post ...
// @Title Post
// @Description create TestData
// @Param	body		body 	models.TestData	true		"body for TestData content"
// @Success 201 {int} models.TestData
// @Failure 403 body is empty
// @router / [post]
func (c *TestDeviceDataController) Post() {
	var device models.TestDevice
	valid := validation.Validation{}

	//Read JSON data and assign values
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &device); err != nil {
		c.ErrMsg(err.Error())
	}

	//Verify that the data is empty
	b, _ := valid.Valid(&device)
	if !b {
		for _, err := range valid.Errors {
			c.ErrMsg(err.Message)
		}
	}
	for i := 0; i < len(device.DevGetJsonData); i++ {
		if (models.CheckTestData(device.DevGetJsonData[i].DataTestData)) != 0 {
			c.Ctx.WriteString("DataTestData nil or space")
			c.StopRun()
		}
		if (models.CheckTestData(device.DevGetJsonData[i].DataTestItem)) != 0 {
			c.Ctx.WriteString("DataTestItem nil or space")
			c.StopRun()
		}
	}

	//IMEI length match
	if len(device.DevImei) != 15 {
		c.Ctx.WriteString("IMEI length mismatch,length must 15")
		c.StopRun()
	}

	v, _ := models.GetTestDeviceByIMEI(device.DevImei)

	if v == nil {
		//Write data to database
		if _, err := models.AddTestDevice(&device); err == nil {
			for i := 0; i < len(device.DevGetJsonData); i++ {
				device.DevGetJsonData[i].TestDeviceId = device.Id
				if _, err := models.AddTestData(device.DevGetJsonData[i]); err != nil {
					c.Data["json"] = err.Error()
					c.ServeJSON()
				}
			}
			c.Data["json"] = device
		} else {
			c.Data["json"] = err.Error()
			c.ServeJSON()
		}
	} else {
		device.Id = v.Id
		models.UpdateTestDeviceById(&device)

		//Delete
		models.DeleteTestDataByTestDeviceId(device.Id)

		//Insert
		for i := 0; i < len(device.DevGetJsonData); i++ {
			device.DevGetJsonData[i].TestDeviceId = device.Id
			models.AddTestData(device.DevGetJsonData[i])
		}
		c.Data["json"] = device
	}

	c.ServeJSON()
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/995483.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存