新手学习beego从前台获取不到数据求解

配置文件也配置了

copyrequestbody = true

路由也设置了

    beego.Router("/login", &controllers.LoginController{}, "post:Register")

具体实现是这样的

func (c *LoginController) Register() {
    //一个文件一个结构体,为避免麻烦,就创建了个map
    resp := make(map[string]interface{})
    defer c.RetData(resp)               //在函数结束前会调用
    beego.Info("resp=",resp)
    //从前端获得数据,并解包放入resp中
    err := json.Unmarshal(c.Ctx.Input.RequestBody, &resp)
    beego.Info("err=",err)
    beego.Info(`resp["name"]=`,resp["name"])
    beego.Info(`resp["password"]=`,resp["password"])

    //创建操作数据库句柄
    o := orm.NewOrm()

    user := models.User{}

    user.Name = resp["name"].(string)

    user.Password = resp["password"].(string)

    //插入数据库
    insertId, errInsert := o.Insert(&user)

    if errInsert != nil{
        beego.Info("errInsert=",errInsert)
        return
    }
    beego.Info("注册成功")
    beego.Info("insert success,insertId=",insertId)

}

然后用了postman来模拟注册 可是什么都没有返回

body
{}
Headers
Content-Length →2
Content-Type →application/json; charset=utf-8
Date →Thu, 25 Oct 2018 03:40:26 GMT
Server →beegoServer:1.10.1

在控制台显示错误,找了相关的问题,但还是没解决

2018/10/25 11:40:26.948 [I] [login.go:23]  resp= map[] 
2018/10/25 11:40:26.948 [I] [login.go:26]  err= unexpected end of JSON input 
2018/10/25 11:40:26.948 [I] [login.go:27]  resp["name"]= <nil> 
2018/10/25 11:40:26.948 [I] [login.go:28]  resp["password"]= <nil> 
2018/10/25 11:40:26.949 [C] [asm_386.s:559]  the request url is  /login
2018/10/25 11:40:26.949 [C] [asm_386.s:559]  Handler crashed with error interface conversion: interface {} is nil, not string
2018/10/25 11:40:26.950 [C] [asm_386.s:559]  /usr/local/go/src/runtime/asm_386.s:559
2018/10/25 11:40:26.950 [C] [asm_386.s:559]  /usr/local/go/src/runtime/panic.go:491
2018/10/25 11:40:26.950 [C] [asm_386.s:559]  /usr/local/go/src/runtime/iface.go:172
2018/10/25 11:40:26.950 [C] [asm_386.s:559]  /workspace/go/src/Gbed/controllers/login.go:35
2018/10/25 11:40:26.950 [C] [asm_386.s:559]  /usr/local/go/src/runtime/asm_386.s:559
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /usr/local/go/src/reflect/value.go:434
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /usr/local/go/src/reflect/value.go:302
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /workspace/go/src/github.com/astaxie/beego/router.go:847
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /usr/local/go/src/net/http/server.go:2619
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /usr/local/go/src/net/http/server.go:1801
2018/10/25 11:40:26.951 [C] [asm_386.s:559]  /usr/local/go/src/runtime/asm_386.s:1635
2018/10/25 11:40:26.952 [server.go:2846]  [HTTP] http: multiple response.WriteHeader calls

新手卡在这里,求大神解惑

已邀请:

chenqinghe

赞同来自: limitMuc

且不说参数是不是错误了,就新手来说, defer的使用就是有问题的。这里有个坑,只不过运气好没有踩到罢了。

defer是函数调用延迟执行,最后执行c.RetData的时候,参数还是开始定义的那个,不过这里map是引用类型,并且没有对resp重新赋值,而是做修改,因此这么写是可以的。但是如果改成下面这样,或者resp是值类型,那么就会出错了:

func foo(){
    var a = make(map[string]interface{})
    defer fmt.Println(a) // output: map[]

    m:= make(map[string]interface{})
    m["1"] =1
    m["2"] =2

    a= m
}

defer一般用于异常处理、释放资源、清理数据、记录日志等。如果用在其他地方,除非心里有数,否则还是不要乱用了。

sunanxiang - Gopher,IT 男,嵩鼠,游戏狂

赞同来自:

看一下你request body 里面数据是怎么填写的

heramerom

赞同来自:

2018/10/25 11:40:26.948 [I] [login.go:26]  err= unexpected end of JSON input 

这一句已经说的很清楚了,传入的json有问题。 试试将requestBody打印出来看看。

beego.Info(string(c.Ctx.Input.RequestBody))

sunanxiang - Gopher,IT 男,嵩鼠,游戏狂

赞同来自:

c.Ctx.Input.RequestBody 是空的,应该你是post数据没有传对。

jinheking

赞同来自:

c.GetString("name") 你看看有没有值?

beego传值用结构体的时候多一些

type User struct {
    Id               int    `form:"-"`
    Username   string `form:"username"`
    Password    string `form:"password"`
}

func (c *LoginController) Register() {
    u := User{}
    if err := c.ParseForm(&u); err != nil {
        c.Info(err)
    }
}

想github登录

赞同来自:

beego用的人蛮多的

jinheking

赞同来自:

确实不少

要回复问题请先登录注册