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