Axios POST на сервере Gin-Gonic (golang) не работает

Я могу использовать GET, но я не могу использовать POST от axios, отправляя данные на мой сервер gin-gonic golang. Это прекрасно работает в Почтальоне. Когда я стреляю по просьбе Аксиоса, я ничего не получаю взамен.

Когда я захожу на сервер gin-gonic, он показывает, что он вернул ошибку 500. После дальнейшей проверки я вижу, что ни одна из переменных поста не была доступна джину.

Когда я использовал Postman, сервер возвращает массив, как указано. У меня есть ощущение, что это может быть связано с заголовками, но я действительно в тупике. Я столкнулся с этой проблемой около 6 месяцев назад и никогда не понимал ее. Теперь я помню, почему я не продолжил работу с axios и nuxt:).

Вот маршрут сервера golang gin-gonic.

func initServer() {
    router := gin.Default()
    config := cors.DefaultConfig()
    config.AddAllowHeaders("*",)
    config.AllowAllOrigins = true
    config.AllowMethods = []string{"POST", "GET"}
    router.Use(cors.New(config))
    v1 := router.Group("/api/v1/stripe")
    {
        v1.POST("/pay", BuyProduct)
        v1.POST("/card", UpdateCard)
        v1.GET("/products", GetAllProducts)
        v1.GET("/products/id/:productId", GetProduct)
        v1.GET("/products/types/:typeId", GetProductType)
        v1.GET("/products/types", GetAllProductTypes)
    }

    // You can get individual args with normal indexing.
    serverAddress := "127.0.0.1:8080"
    if len(os.Args) > 1 {
        arg := os.Args[1]
        serverAddress = fmt.Sprintf("127.0.0.1:%v", arg)
    }

    router.Run(serverAddress)
}

Вот функция получателя, которая обрабатывает вызовы маршрутизатора при достижении конечной точки

func BuyProduct(c *gin.Context) {

    postUserID := c.PostForm("userId")
    postProductId := c.PostForm("productId")
    token := c.PostForm("token")

    userId, err := strconv.Atoi(postUserID)
    if err != nil {
    panic(err)
    }
    productId, err := strconv.Atoi(postProductId)
    if err != nil {
        panic(err)
    }

    custy := user.InitCustomer(int64(userId), token)
    custy.GetStripeCustomerData()
    custy.SelectProduct(products.NewProduct(int64(productId)))
    custy.Purchase()

    c.JSON(200, gin.H{"status": 200,
        "product": custy.Product,
        "user": *custy.Saver.User,
        "subscriptions": *custy.Subscriptions,
        "ch": custy.Logs,
    })

    return
}

Вот мой аксиос (пустой) код.

async purchaseSubscription() {
    const paid = await 
    this.$axios.$post('http://localhost:8080/api/v1/stripe/pay', { data: { 
        userId: "121",
        productId: this.productId,
    }, query: {  } })
    this.paid = paid
},

Вот ошибка, которую я получаю на сервере gin-gonic в go

2018/10/09 00:12:34 [Восстановление] 2018/10/09 - 00:12:34 паника восстановилась:
POST / api / v1 / stripe / pay HTTP / 1.1
Хост: localhost:8080
Принять: приложение / JSON, текст / обычный, /
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US, en; q = 0,9
Cache-Control: без кеша
Подключение: keep-alive
Длина контента: 52
Тип контента: application / json; charset = UTF-8
Dnt: 1
Происхождение: http://localhost:3000/
Прагма: без кеша
Реферер: http://localhost:3000/
Пользователь-агент: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, как Gecko) Chrome / 69.0.3497.100 Safari / 537.36
strconv.Atoi: синтаксический анализ "": неверный синтаксис
/usr/local/go/src/runtime/panic.go:502 (0x102aca8)
gopanic: reflecall(ноль, unsafe.Pointer (d.fn), deferArgs (d), uint32 (d.siz), uint32 (d.siz))
/Users/joealai/go/src/sovrin-mind-stripe/sm-stripe.go:150 (0x15f9ee5)
BuyProduct: паника (ошибка)
[GIN] 2018/10/09 - 00:12:34 | 500 | 1,079498мс | 127.0.0.1 | POST /api/v1/stripe/pay

2 ответа

Решение

Я думаю, что проблема не в джине или не в джине, а только в вашем вызове. Обратите внимание, что вы получаете доступ к c.PostForm значения, но в вашем вызове axios вы не отправляете значения формы, вы отправляете json, поэтому в ваших переменных значение пустое. Если вы используете Postman, я полагаю, что вы успешно отправляете PostForm, но не в своих аксиосах. Я рекомендую по-прежнему отправлять сообщение (также добавить заголовок content-type: application-json) и c.Bind тело в struct или map[string]interface{}, а затем приведение к вашим конкретным типам в вашем обработчике.

В базовом пакете веб-сервера Go нет встроенного в Gin-gonic поиска JSON POST Retrieval. Вместо этого нам нужно использовать c.GetRawData(), а затем распаковать результаты в структуру! Поскольку c.GetRawData () включает в себя data: { userId: 121, productId: 12, token: tok_visa }структура должна также содержать data JSON Field, а также. Я надеюсь, что это помогает кому-то еще! Спасибо @Carles

type Buy struct {
    Data struct {
        User    int64 `json:"userId" binding:"required"`
        Product int64 `json:"productId" binding:"required"`
        Token   string `json:"token"`
    } `json:"data"`
}

func BuyProduct(c *gin.Context) {

    a := Buy{}
    b, err := c.GetRawData()
    if err != nil {
        panic(err)
    }
    json2.Unmarshal(b, &a)
    userId := a.Data.User
    productId := a.Data.Product

    token := a.Data.Token
Другие вопросы по тегам