Beego

beego注解路由404

月盾

beego注解路由匹配不到,返回404页面 router.go使用了两种方式注册路由:

ns := beego.NewNamespace("/admin",
	beego.NSRouter("/", &controllers.UserController{}, "get:Welcome"),
	beego.NSInclude(
		&controllers.UserController{},
	),

controller中的路由注解设置:

// @router /admin/user/get-all-user [get]
func (c *UserGroupController) GetAllUser() {
	user := new(User)
	users, err := user.GetUserList()
	if nil != err {
		c.Data["json"] = ErrorMsg(err)
	}
	c.Data["json"] = users
	c.ServeJSON()
}

使用上面的方式注册路由后结果是nomatch

最终结果显示上面的注解路由时错误的,下面是正确的注册方式: 问题在于controller的注解写法,如果该路由在namespace下,则不能在注解中拼接命名空间前缀,框架会自动拼接。 即/admin为命名空间,注解中只需写/user/get-all-user,不能这样写/admin/user/get-all-user

// @router /user/get-all-user [get]
func (c *UserGroupController) GetAllUser() {
	user := new(User)
	users, err := user.GetUserList()
	if nil != err {
		c.Data["json"] = ErrorMsg(err)
	}
	c.Data["json"] = SuccessData(users)
	c.ServeJSON()
}

当然,两种路由注册的方式可以同时

完整项目:https://github.com/yuedun/metal

beego post请求获取request body参数

月盾

为了获取json类型的参数煞费苦心,差点不再爱了。

前端请求代码:

$.ajax({
    url: "/user",
    type: "post",
    contentType: 'application/json',
    data: JSON.stringify({username:"张三",mobile:"13265478965"}),
    //这才是最重要的地方,必须用JSON.stringify序列化成字符串,
    //直接使用对象死活都接收不到,至于大小写并不影响,只要写对了就行
    dataType: "json"
}).done(function(res) {
    if(res.result){
        alert("成功")
    }
});

需要传输json类型数据,同时数据需要使用JSON.stringify序列化。

后端接收代码:

func (c *UserController) Post() {
    var form struct {
		Username string `json:"username"`
		Mobile   string `json:"mobile"`
	}
	c.BindJSON(&form)
    user := &User{Username: form.UserName, Mobile: form.Mobile}
    err := user.AddUser()//这是添加用户函数
    if nil != err {
        c.Data["json"] = map[string]interface{}{"result": false, "msg": err}
    } else {
        c.Data["json"] = map[string]interface{}{"result": true, "msg": "新增成功"}
    }
    c.ServeJSON()
}

可以使用beego提供的BindJSON函数解析json数据。

特别注意: 如果数据类型不匹配也会造成空数据结果。 例如:前端参数是age: "23",model中age int,也会获取不到数据。