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请求)