У меня есть функция SignUp, и я пытаюсь получить тело запроса, отправляемого фреймворком Vue, но оно пустое.
Идти
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: "[email protected]",
password: "password"
})
.then(response => {
console.info(e.response)
})
.catch(e => {
console.info(e.response)
})
Если я использую Postman, я получаю эту информацию журнала
2018/10/27 14:11:48 #####################
2018/10/27 14:11:48 map[email:[[email protected]] password:[password] username:[test]]
2018/10/27 14:11:48 map[Vary:[Origin] Access-Control-Allow-Origin:[*]]
2018/10/27 14:11:48 #####################
Если я попытаюсь отправить по Vue, я ничего не получу
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 отправляет их правильно.
<ActionController::Parameters {"username"=>"test", "email"=>"[email protected]", "password"=>"password"
Любые идеи?
@ Зелёный, да, конечно. Я вижу URL-адрес в консоли браузера. params: map[]
Вы пробовали Bind interface? Так я отправляю данные через axios и vueform := new(SignUpForm) if err = c.Bind(form); err != nil { return }
@mkopriva ты прав. в вашем vue main.js добавьте следующий axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Как заявил @mkopriva, axios отправляет как json, но echo ищет x-www-form-urlencoded. В вашем vue добавьте axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' или передайте заголовок в каждом axios.post
В эхо вы можете c.Bind запрос в свою переменную, как показано ниже. Таким образом можно получить json или form (почтальон для тестирования и 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)
}
}
Да, мне просто нужно было определить параметры json в структуре. Спасибо!
Вы уверены, что параметры не передаются по URL-адресу? Попробуй отладить.
fmt.Println("params:", c.QueryParams())