# Input
In general, processing input relies heavily on the methods provided by the Controller. And specific inputs can be found in:
- Path variable: refer to router
- Query parameter
- Body: To read data from the request body, for most cases setting
BConfig.CopyRequestBodytotrueis enough. If you create more than oneweb.Server, then you must setCopyRequestBodytotruein eachServerinstance
And the methods of obtaining parameters can be divided into two main categories:
- Methods prefixed with Get: this is a large category of methods that try to get the value of a particular parameter
- Methods prefixed with Bind: this is a large category of methods that attempt to convert input into a structure
# Get
For this type of method, Beego reads from two main places: the query parameters and the form. If there are parameters with the same name in both places, then Beego returns the data inside the form. For example:
type MainController struct {
web.Controller
}
func (ctrl *MainController) Post() {
name := ctrl.GetString("name")
if name == "" {
ctrl.Ctx.WriteString("Hello World")
return
}
ctrl.Ctx.WriteString("Hello " + name)
}
When we access.
- Path
localhost:8080?name=a, it will outputHello, a - Path
localhost:8080and the form is submitted withname=b, then the output will beb - Path
localhost:8080?name=aand the form is submitted withname=b, thenbwill be output
Methods in this category also allow default values to be passed in:
func (ctrl *MainController) Get() {
name := ctrl.GetString("name", "Tom")
ctrl.Ctx.WriteString("Hello " + name)
}
If we don't pass the name parameter, then Tom will be used as the value of name, for example when we access GET localhost:8080, it will output Hello Tom.
It should be noted that the method signature of GetString is:
func (c *Controller) GetString(key string, def ...string) string {
// ...
}
Note that although def is declared as a variable parameter, in practice, Beego will only use the first default value, and all subsequent ones will be ignored.
The method signatures and behaviors are similar for this class, they are:
GetString(key string, def ...string) stringGetStrings(key string, def ...[]string) []stringGetInt(key string, def ...int) (int, error)GetInt8(key string, def ...int8) (int8, error)GetUint8(key string, def ...uint8) (uint8, error)GetInt16(key string, def ...int16) (int16, error)GetUint16(key string, def ...uint16) (uint16, error)GetInt32(key string, def ...int32) (int32, error)GetUint32(key string, def ...uint32) (uint32, error)GetInt64(key string, def ...int64) (int64, error)GetUint64(key string, def ...uint64) (uint64, error)GetBool(key string, def ...bool) (bool, error)GetFloat(key string, def ...float64) (float64, error)
Note that GetString and GetStrings themselves are not designed to return error, so you can't get an error.
# Bind
Most of the time, we also need to convert the input to a structure, and Beego provides a series of methods to do the input-to-structure binding.
This part of the method is defined directly on the Context structure, so the user can manipulate the Context instance directly. To simplify the operation, we have defined similar methods on the Controller.
// set web.BConfig.CopyRequestBody = true
type MainController struct {
web.Controller
}
func (ctrl *MainController) Post() {
user := User{}
err := ctrl.BindJSON(&user)
if err != nil {
ctrl.Ctx.WriteString(err.Error())
return
}
ctrl.Ctx.WriteString(fmt.Sprintf("%v", user))
}
type User struct {
Age int `json:"age"`
Name string `json:"name"`
}
Bind(obj interface{}) error: Based onContent-TypeBindYAML(obj interface{}) errorBindForm(obj interface{}) errorBindJSON(obj interface{}) errorBindProtobuf(obj proto.Message) errorBindXML(obj interface{}) error
Note that although we provide a way to determine how to bind based on Content-Type, we prefer users to use the bind method that specifies the format.
An API that should only accept input in a particular format, such as JSON only, and should not be able to handle multiple inputs
In the early days, Beego also had a method similar to BindForm: ParseForm(obj interface{}) error, both of which have the same effect.
# Path Variable
Refer to Path Variable Router
# Historical Bind methods
In Beego's Input there is a family of methods defined for reading parameters. This class of methods is very similar to the Get family of methods.
Example:
?id=123&isok=true&ft=1.2&ol[0]=1&ol[1]=2&ul[]=str&ul[]=array&user.Name=astaxie
var id int
this.Ctx.Input.Bind(&id, "id") //id ==123
var isok bool
this.Ctx.Input.Bind(&isok, "isok") //isok ==true
var ft float64
this.Ctx.Input.Bind(&ft, "ft") //ft ==1.2
ol := make([]int, 0, 2)
this.Ctx.Input.Bind(&ol, "ol") //ol ==[1 2]
ul := make([]string, 0, 2)
this.Ctx.Input.Bind(&ul, "ul") //ul ==[str array]
user struct{Name}
this.Ctx.Input.Bind(&user, "user") //user =={Name:"astaxie"}