最近在学习vue,由于之前做这个博客的后台比较简陋,顺势就把管理后台改用restful + vue的形式,重新改做,记录一下遇到的小问题。
后端用的是beego(golang), 前端网路请求库用的是axios。
beego做restful 路由很简单, 只需要一行route就可以把GET、POST、PUT、DELETE四个方法的路由都做好。
比如添加post的restful,四个请求方法的路由:
ns := beego.NewNamespace("/admin",
// Post restful api
beego.NSRouter("post/?:id", &admin.Post{}),
)
beego.AddNamespace(ns)
它会自动对应路由中同名的方法Get、Post、Put、Delete
当然/post/id 后面的id通常只在get和delete中用到,所以在路由中添加个?,表示可选。
beego接收request body为空的问题
其实在官方文档有写,在用json或者xml的request时,要获取数据,需要在conf文件中,将copyrequestbody设置为true。
copyrequestbody = ture
在用axios发送post和put请求的时候,通常会把提交的数据以json的形式放到request body里面,直接在beego中,用对应的form结构体或者model去解析就能获取到数据。
json.Unmarshal(c.Ctx.Input.RequestBody, &post)
说到json解析,这里还有另一个解析的方法
json.NewDecoder(c.Ctx.Request.Body).Decode(&inputData)
两者的区别在于,上一个是将现有的数据字节,decode成json,下面的可以在数据流中去decode。通俗的意思是,上面的在解析时,数据必须已经是完整的了,下面的可以边接收边解析。
但我发现这两个方法在这里还有个区别。
上一个 Unmarshal 可以只覆盖提交的字段里的信息, 而下面的,会将整个结构体的字段都覆盖掉。
例如:
有篇文章,我只改动的标题,而且在前端发送的数据中,是只发了{id:1, title: “修改的标题”}
用Unmarshal,我在后端可以用id先找到文章,然后直接用这文章的结构体实例,去接收RequestBody的内容, 它就只把新title覆盖到现有结构体的title,其它的我没传的都保持不变。
而用NewDecoder的方法,用read出来的结构体,再去接收body的数据,它会将所有字段都覆盖,其它没传的,就是空值。
当然,实际上可能不会直接将传过来的数据覆盖原数据并保存, 这只是个小发现,使用上要注意的点罢了。