Go Echo没有从Vue获得POST正文 [英] Go Echo not getting POST body from Vue

查看:84
本文介绍了Go Echo没有从Vue获得POST正文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我具有SignUp功能,并尝试获取由Vue框架发送的请求的正文,但是它为空.

I have SignUp function and trying to get the body of a request which sending by Vue framework, but it's empty.

开始

type SignUpForm struct {
    Username string
    Email    string
    Password string
}

func SignUp(c echo.Context) error {
    form := SignUpForm{
        Username: c.FormValue("username"),
        Email:    c.FormValue("email"),
        Password: c.FormValue("password")}

    user := models.User{
        Username: form.Username,
        Email:    form.Email,
        Password: models.HashPassword(form.Password),
    }

    log.Printf("#####################")
    values, _ := c.FormParams()
    log.Printf("%v\n", values)
    log.Printf("%v", c.Response().Header())
    log.Printf("#####################")

    err := database.Connection().Create(&user).Error
    if err != nil {
        return c.JSON(http.StatusInternalServerError, err)
    } else {
        return generateJwtToken(c, user)
    }
}

Vue

 sendForm: function() {
  var link = '/auth/sign_up'
  axios.post(link, {
    username: "test",
    email: "user@gmail.com",
    password: "password"
  })
  .then(response => {
    console.log(e.response)
  })
  .catch(e => {
    console.log(e.response)
  })

如果我使用邮递员,则会获得此日志信息

If I use Postman I get this log information

2018/10/27 14:11:48 #####################
2018/10/27 14:11:48 map[email:[user@gmail.com] password:[password] username:[test]]
2018/10/27 14:11:48 map[Vary:[Origin] Access-Control-Allow-Origin:[*]]
2018/10/27 14:11:48 #####################

如果我尝试通过Vue发送,我一无所获

If I try to send by Vue I get nothing

2018/10/27 14:14:55 #####################
2018/10/27 14:14:55 map[]
2018/10/27 14:14:55 map[Vary:[Origin] Access-Control-Allow-Origin:[*]]
2018/10/27 14:14:55 #####################

我完全确定这是go/echo问题,因为我能够在rails应用程序中获取这些参数,因此Vue可以正确发送它们.

I'm totally sure it's go/echo issue because I'm able to get those params in my rails app, so Vue sends them correctly.

<ActionController::Parameters {"username"=>"test", "email"=>"user@gmail.com", "password"=>"password"

有什么想法吗?

推荐答案

如@mkopriva所述,axios确实以json的身份发送,但echo查找x-www-form-urlencoded.在您的vue中添加axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'或在每个axios.post

As @mkopriva stated axios does send as json but echo looks for x-www-form-urlencoded. In your vue add axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' or pass the header in each axios.post

在echo中,您可以将请求c.Bind放入变量中,如下所示.这样,您就可以收到jsonform(用于测试和vue的邮递员)

In echo you can c.Bind the request into your variable like below. That way you can receive json or form (postman for testing and vue)

type SignUpForm struct {
    Username string `json:"username" form:"username" query:"username"`
    Email    string `json:"email" form:"email" query:"email"`
    Password string `json:"password" form:"password" query:"password"`
}

func SignUp(c echo.Context) error {

    form := new(SignUpForm)

    if err := c.Bind(form); err != nil {
        return c.JSON(http.StatusBadRequest, err)
    }

    user := models.User{
        Username: form.Username,
        Email:    form.Email,
        Password: models.HashPassword(form.Password),
    }

    log.Printf("#####################")
    values, _ := c.FormParams()
    log.Printf("%v\n", values)
    log.Printf("%v", c.Response().Header())
    log.Printf("#####################")

    err := database.Connection().Create(&user).Error
    if err != nil {
        return c.JSON(http.StatusInternalServerError, err)
    } else {
        return generateJwtToken(c, user)
    }
}

这篇关于Go Echo没有从Vue获得POST正文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆