Beego框架 POST请求接口编写

Posted 一只小阿大:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Beego框架 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()



以上是关于Beego框架 POST请求接口编写的主要内容,如果未能解决你的问题,请参考以下文章

beego框架(golang)学习过滤器(实现restful请求)

Beego框架 get请求编写

Beego框架 get请求编写

Beego框架之请求数据处理

egg 项目里编写基础的 POST 接口:使用 POST 请求参数获取

Beego接收Json, 并发请求, 返回Json