I have SignUp function and trying to get the body of a request which sending by Vue framework, but it's empty.
Go
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
", 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 #####################
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 #####################
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"
Any ideas?
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
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
", 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)
}
}