CopyRequestBody 参数

在 Beego web 的配置中,有一个很让人困惑的参数,叫做CopyRequestBody。它是在结构体web.Config中。

该参数的引入主要有两个目的:

  • Beego 读取 HTTP 请求体数据,并进行一些处理。同时,在 Beego 读取之后,用户还可以再次读取; -

我们可以通过两个例子来感受一下CopyRequestBody的效果。

第一个例子是我们开启了CopyRequestBody

  1. func main() {
  2. web.BConfig.CopyRequestBody = true
  3. web.CtrlPost("/hello", (*MainController).ReadDataFromBody)
  4. web.Run()
  5. }
  6. type MainController struct {
  7. web.Controller
  8. }
  9. func (m *MainController) ReadDataFromBody() {
  10. u := &user{}
  11. err := m.Controller.BindJson(u)
  12. if err != nil {
  13. logs.Error("could not bind json data: %v", err)
  14. }
  15. err = m.JsonResp(u)
  16. if err != nil {
  17. logs.Error("could not write json resp: %v", err)
  18. }
  19. }

当我们访问localhost:8080并且传入参数之后,我们能够得到响应: CopyRequestBody=true

如果我们将CopyRequestBody设置为false

  1. func main() {
  2. web.BConfig.CopyRequestBody = false
  3. web.CtrlPost("/hello", (*MainController).ReadDataFromBody)
  4. web.Run()
  5. }
  6. type MainController struct {
  7. web.Controller
  8. }
  9. func (m *MainController) ReadDataFromBody() {
  10. u := &user{}
  11. err := m.Controller.BindJson(u)
  12. if err != nil {
  13. logs.Error("could not bind json data: %v", err)
  14. }
  15. err = m.JsonResp(u)
  16. if err != nil {
  17. logs.Error("could not write json resp: %v", err)
  18. }
  19. }

那么我们会发现,我们无法从请求体里面读到数据了: CopyRequestBody=false

所以,要注意的是,如果你打算依赖于 Beego 来处理请求,那么应该把CopyRequestBody设置为true

CopyRequestBody以当下的眼光看过去,应该算是有点累赘了。不过它的好处就在于,你可以多次从 Beego 中读取数据。毕竟http.Request里面的Body字段,只能读取一次。

从这个意义上来说,目前也还算是值得保留下去。但是我们考虑会在将来把它的默认值设置为true,而不是false