Axios POST на сервере Gin-Gonic (golang) не работает - PullRequest
0 голосов
/ 09 октября 2018

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

Когда я захожу на сервер 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
}

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

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
Принять: application / json, текст / обычный, /
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US, en; q = 0,9
Cache-Control: no-cache
Соединение: keep-alive
Content-Length: 52
Content-Type: application / json; кодировка = 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 ]

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

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

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
0 голосов
/ 09 октября 2018

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

...