Beego处理http请求数据

https://www.cnblogs.com/Paul-watermelon/articles/11033010.html

一、获取参数

1.1 GetXXX()方法

我们经常需要获取用户传递的数据,包括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")
}

重启项目,并在浏览器中输入网址以及传递参数:

1.2 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=hanru

浏览器运行结果如下:

1.3 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/>&nbsp&nbsp&nbsp码:<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")
}

重启项目,并打开浏览器输入:http://127.0.0.1:9527/testinput

 

 

 

通过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 标签的值设置为 -

1.4 Request Body

在 API 的开发中,我们经常会用到 JSON 或 XML 来作为数据交互的格式,如何在 beego 中获取 Request Body 里的 JSON 或 XML 的数据呢?

  1. 在配置文件里设置 copyrequestbody = true 在 Controller 中
  2. 在 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()
 }
复制代码

    A+
发布日期:2021年07月27日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: