我可以使用GET,但不能使用来自axios的POST将数据发送到gin-gonic golang服务器。它在邮递员中完美运行。当我使用Axios处理请求时,没有任何回报。
当我进入gin-gonic服务器时,它表明它返回了500错误。经过进一步检查,我发现gin没有访问过post变量。
当我使用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
}
这是我的axios(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
},
这是我在go的gin-gonic服务器中遇到的错误
2018/10/09 00:12:34 [恢复] 2018/10/09-00:12:34恐慌恢复:
POST / api / v1 / stripe / pay HTTP / 1.1
主机:localhost:8080
接受:application / json,text / plain, /
接受编码:gzip,deflate,br
接受语言:en-US,en; q = 0.9
缓存控制:无缓存
连接:保持活动状态
内容长度: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)
西班牙语:reflectcall(nil,不安全。Pointer(d.fn),deferArgs(d),uint32(d.siz),uint32(d.siz))
/用户/joealai/go/src/sovrin-mind-stripe/sm-stripe.go:150(0x15f9ee5)
BuyProduct:恐慌(err)
[GIN] 2018/10/09-00:12:34 | 500 | 1.079498ms | 127.0.0.1 | POST / api / v1 / stripe / pay
答案 0 :(得分:2)
我认为问题不在于杜松子酒或杜松子酒,而不仅仅是您的电话。请注意,您正在访问c.PostForm
值,但是在axios调用中,您没有发送表单值,而是发送了json,因此变量中的值为空。如果您使用的是Postman,我想您发送PostForm的情况很好,但在axios中却不行。我的建议是仍然发送Post(还添加一个content-type:application-json标头),并将c.Bind
正文发送到struct或map [string] interface {},然后将其强制转换为您的特定类型处理程序。
答案 1 :(得分:0)
据我了解,在Go的基本Web服务器程序包中,gin-gonic并没有内置JSON POST检索。相反,我们需要使用c.GetRawData(),然后将结果解组为结构!由于c.GetRawData()包含data: { userId: 121, productId: 12, token: tok_visa }
,因此该结构还必须还包含data
json字段。我希望这可以帮助其他人!谢谢@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