小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
接下来,我们也写一个Controller,新建一个go文件,命名为test.go,代码如下:
package controllers
import (
"github.com/astaxie/beego"
)
type TestController struct {
beego.Controller
}
func (c *TestController) TestGet() {
//c.Ctx.WriteString("<html><h3>TestController。。。。。this is method get!</h3></html>")
c.Ctx.WriteString("<font color='green' size='6'>TestController。。。。。this is method get!</font>")
}
func (c *TestController) TestPost() {
c.Ctx.WriteString("TestController。。。。。this is method post!")
}
说明:
func (ctx *Context) WriteString(content string) { ctx.ResponseWriter.Write([]byte(content)) }这个方法支持HTML的标签。
接下来修改router.go文件中的init()方法:
func init() {
beego.Router("/", &controllers.MainController{},"get:Get;post:Post")
beego.Router("/test", &controllers.TestController{},"get:TestGet;post:TestPost")
}
然后重启项目,打开浏览器输入网址:http://127.0.0.1:9527/test
我们经常需要获取用户传递的数据,包括Get、POST 等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据:
- GetString(key string) string
- Getstrings(key string) []string
- GetInt(key string) (int64, error)
- GetBool(key string) (bool, error)
- GetFloat(key string) (float64, error)
如果是get请求,我们可以通过url来传递参数,那么可以通过以上方法进行获取
新建一个go文件testinput.go,用于创建一个Controller:
package controllers
import (
"github.com/astaxie/beego"
)
type TestInputController struct {
beego.Controller
}
func (c *TestInputController) TestInputGet() {
id := c.GetString("id")
c.Ctx.WriteString(id)
}
接下来修改router.go中的init()方法:
func init() {
beego.Router("/", &controllers.MainController{},"get:Get;post:Post")
beego.Router("/test", &controllers.TestController{},"get:TestGet;post:TestPost")
beego.Router("/testinput", &controllers.TestInputController{},"get:TestInputGet")
}
重启项目,并在浏览器中输入网址以及传递参数。
Input()方法
也可以通过Input()方法,也可以获取数据
修改TestInputGet()方法如下:
func (c *TestInputController) TestInputGet() {
name := c.GetString("name")
c.Ctx.WriteString("<html>"+name+"<br/>")
idstr:=c.Input().Get("id")
c.Ctx.WriteString(idstr+"</html>")
id,_:=strconv.Atoi(idstr)
fmt.Println(id)
}
然后重启项目,并打开浏览器输入以下内容:http://127.0.0.1:9527/testinput?id=1024&name=hello
ParseForm()方法
通过ParseForm()方法,可以直接映射一个结构体对象,修改TestInputGet()方法如下:
func (c *TestInputController) TestInputGet() {
c.Ctx.WriteString(`<html><form action="http://127.0.0.1:9527/testinput" method="post">
用户名:<input type ="text" name="Username" />
<br/>
密   码:<input type="password" name="pwd">
<br/>
<input type="submit" value="提交">
</form></html>`)
}
创建一个struct:
type User struct {
Username string //对应表单中的name值,字段名首字母也必须大写,否则无法解析该参数的值
Password string `form:"pwd"` //也可以指定form表单中对应的name值,如果不写将无法解析该参数的值
}
Controller 里解析,添加TestInputPost()方法:
func (c *TestInputController) TestInputPost() {
u := User{}
if err := c.ParseForm(&u); err != nil {
log.Panic(err)
}
c.Ctx.WriteString("Username:" + u.Username + ",Password:" + u.Password)
}
修改注册路由的init()方法:
func init() {
beego.Router("/", &controllers.MainController{},"get:Get;post:Post")
beego.Router("/test", &controllers.TestController{},"get:TestGet;post:TestPost")
beego.Router("/testinput", &controllers.TestInputController{},"get:TestInputGet;post:TestInputPost")
}
通过get方法的访问,我们向页面写出了一个form表单,然后填写用户名和密码,并点击提交按钮。
通过post方法的访问,我们向页面写出来了读到的用户名和密码。
注意:
- StructTag form 的定义和 renderform方法 共用一个标签
- 定义 struct 时,字段名后如果有 form 这个 tag,则会以把 form 表单里的 name 和 tag 的名称一样的字段赋值给这个字段,否则就会把 form 表单里与字段名一样的表单内容赋值给这个字段。如上面例子中,会把表单中的 username 和 age 分别赋值给 user 里的 Name 和 Age 字段,而 Email 里的内容则会赋给 Email 这个字段。
- 调用 Controller ParseForm 这个方法的时候,传入的参数必须为一个 struct 的指针,否则对 struct 的赋值不会成功并返回xx must be a struct pointer 的错误。
- 如果要忽略一个字段,有两种办法,一是:字段名小写开头,二是:form 标签的值设置为 -
Request Body
在 API 的开发中,我们经常会用到 JSON 或 XML 来作为数据交互的格式,如何在 beego 中获取 Request Body 里的 JSON 或 XML 的数据呢?
- 在配置文件里设置 copyrequestbody = true 在 Controller 中
- 在 Controller 中
func (this *ObejctController) Post() {
var ob models.Object
json.Unmarshal(this.Ctx.Input.RequestBody, &ob)
objectid := models.AddOne(ob)
this.Data["json"] = "{\"ObjectId\":\"" + objectid + "\"}"
this.ServeJson()
}