Go Echo не получает POST тело от Vue - PullRequest
0 голосов
/ 27 октября 2018

У меня есть функция SignUp и я пытаюсь получить тело запроса, который отправляется Vue Framework, но он пуст.

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\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)
  })

Если я использую Почтальон, я получаю эту информацию журнала

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, я ничего не получаю

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"=>"user@gmail.com", "password"=>"password"

Есть идеи?

1 Ответ

0 голосов
/ 27 октября 2018

Как сказал @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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...