Go Echo не получает тело POST от Vue

У меня есть функция 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-адресу? Попробуй отладить. fmt.Println("params:", c.QueryParams())

Зелёный 27.10.2018 13:38

@ Зелёный, да, конечно. Я вижу URL-адрес в консоли браузера. params: map[]

Croaton 27.10.2018 14:21
github.com/axios/… Я считаю, что вы отправляете json с помощью axios, но пытаетесь прочитать закодированную форму с помощью echo.
mkopriva 27.10.2018 15:10

Вы пробовали Bind interface? Так я отправляю данные через axios и vueform := new(SignUpForm) if err = c.Bind(form); err != nil { return }

Varcorb 27.10.2018 16:37

@mkopriva ты прав. в вашем vue main.js добавьте следующий axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

Varcorb 27.10.2018 16:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
1 524
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как заявил @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 в структуре. Спасибо!

Croaton 27.10.2018 17:36

Другие вопросы по теме