javascript - Go Echo 没有从 Vue 获取 POST 正文

标签 javascript http go vue.js axios

我有 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: "user@gmail.com",
    password: "password"
  })
  .then(response => {
    console.log(e.response)
  })
  .catch(e => {
    console.log(e.response)
  })

如果我使用 Postman,我会得到这个日志信息

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"

有什么想法吗?

最佳答案

正如@mkopriva 所述,axios 确实以 json 的形式发送,但 echo 寻找 x-www-form-urlencoded。在你的 vue 添加 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' 或在每个axios.post

在 echo 中,您可以c.Bind 请求到您的变量中,如下所示。这样你就可以接收 jsonform(用于测试和 vue 的 postman )

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

关于javascript - Go Echo 没有从 Vue 获取 POST 正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53021416/

相关文章:

javascript - 从views.py获取Django Python数据到template.html中的javascript对象

pointers - 通过引用传递自定义 slice 类型

postgresql - 限制 pq 连接 SetMaxOpenConns

javascript - 设置 JavaScript 对象的格式

javascript - 使用 Webpack、React、Babel 组合时,React 代码未运行

javascript - dojox.widget.Toaster 的相对定位

c++ - 我的重定向机制有什么问题?

node.js - Express 是否默认禁用 CORS?

php - 使用 Android PHP Web 服务从服务器获取数组

redirect - 在 Go 中查询没有重定向的 URL