# CopyRequestBody 参数

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

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

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

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

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


func main() {
	web.BConfig.CopyRequestBody = true
	web.CtrlPost("/hello", (*MainController).ReadDataFromBody)
	web.Run()
}

type MainController struct {
	web.Controller
}

func (m *MainController) ReadDataFromBody() {
	u := &user{}
	err := m.Controller.BindJson(u)
	if err != nil {
		logs.Error("could not bind json data: %v", err)
	}
	err = m.JsonResp(u)
	if err != nil {
		logs.Error("could not write json resp: %v", err)
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

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

如果我们将CopyRequestBody设置为false

func main() {
	web.BConfig.CopyRequestBody = false
	web.CtrlPost("/hello", (*MainController).ReadDataFromBody)
	web.Run()
}

type MainController struct {
	web.Controller
}

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

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

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

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

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