go - 为什么数组不绑定在 golang 光纤中?
问题描述
向golang Fiber发送json数据,尝试将接收到的数据绑定到struct,但是失败了,
type MapTag struct {
Id uint `json:"id" form:"tag_name" xorm:"bigint unsigned pk autoincr"`
TagName string `json:"tag_name" form:"tag_name" xorm:"index"`
CreatedAt time.Time `json:"created_at" form:"created_at" xorm:"timestamp created"`
UpdatedAt time.Time `json:"updated_at" form:"updated_at" xorm:"timestamp updated"`
}
type _inData struct {
Title string `json:"title" form:"title"`
TagList []model.MapTag `json:"tag_list" form:"tag_list"`
}
inData := new(_inData)
c.BodyParser(inData)
fmt.Print(inData)
结果是&{title.value []}
,为什么不能绑定到TagList??
我发送了,json这样的
{"title" : "title.value", "tag_list":[{"id":"1", "tag_name" :"test"},{"id":"2","tag_name":"test2"}]}
我浪费了很多时间,请帮助
同样,我编写了如下代码,
fmt.Println(string(c.Body()))
type _inData struct {
Title string
TagList []model.MapTag `form:"tag_list"`
}
inData := &_inData{}
if err := c.BodyParser(inData); err != nil {
return err
}
fmt.Println(inData)
我得到如下结果,仍然没有绑定到 tagList
{"title":"123123","tag_list":[{"id":42,"tag_name":"234234"},
{"id":43,"tag_name":"345345"}]}
&{123123 []}
我正在将数据从颤振发送到 golang 光纤,如下所示,它对解决问题有帮助吗?
var response = await dio.post(
Uri.parse(System.baseV1 + "/v1/map/create").toString(),
data: {
"title": mapTitle,
"tag_list": tagList.toList(),
// "file": await MultipartFile.fromFile(mainImage!.path),
},
options: Options(
headers: {
"Authorization": "Barer " + storage.getString('token').toString(),
"Content-Type": "application/json"
},
),
);
解决方案
我是一个经常使用光纤的用户。
发生这种情况的原因是因为您没有在请求正文中定义Content-Type: application/json
为您的标头之一,并且您错误地发送了请求正文。
这是我破解的解决方案。
package main
import (
"fmt"
"net/http"
"time"
"github.com/gofiber/fiber/v2"
)
type MapTag struct {
Id uint `json:"id" form:"tag_name" xorm:"bigint unsigned pk autoincr"`
TagName string `json:"tag_name" form:"tag_name" xorm:"index"`
CreatedAt time.Time `json:"created_at" form:"created_at" xorm:"timestamp created"`
UpdatedAt time.Time `json:"updated_at" form:"updated_at" xorm:"timestamp updated"`
}
type Input struct {
Title string `json:"title" form:"title"`
TagList []MapTag `json:"tag_list" form:"tag_list"`
}
func main() {
app := fiber.New()
app.Post("/", func(c *fiber.Ctx) error {
data := &Input{}
if err := c.BodyParser(data); err != nil {
return err
}
fmt.Println(data)
return c.SendStatus(http.StatusOK)
})
app.Listen(":8080")
}
您的 JSON 字符串也有问题。您应该发送一个文字数字(用于您的id
属性),而不是字符串。发送您的 JSON 正文,如下所示。
curl -H "Content-Type: application/json" -X POST -d '{"title":"title.value", "tag_list":[{"id":1, "tag_name" :"test"},{"id":2,"tag_name":"test2"}]}' http://localhost:8080; echo
它应该带来这样的结果。
akasha@Akashas-MacBook-Pro so-answers % go run main.go
# snip...
&{title.value [{1 test 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC} {2 test2 0001-01-01 00:00:00 +0000 UTC 0001-01-01 00:00:00 +0000 UTC}]}
如果您需要对此问题的进一步解释,请查看文档。
将请求正文绑定到结构。BodyParser 支持基于 Content-Type 标头解码查询参数和以下内容类型:
- 应用程序/json
- 应用程序/xml
- 应用程序/x-www-form-urlencoded
- 多部分/表单数据
在 GitHub 中的 Fiber 官方示例存储库中查看以下参考资料以获取更多信息(免责声明:我写的)
推荐阅读
- ios - 在 Flutter 中使用平台特定代码时如何在 App Delegate 中实现协议委托模式?
- python - 如何使用 Python 访问 Amazon EMR 错误消息
- python - 无法在 macOS Big Sur 上使用 PyQt5 获取屏幕截图
- presto - 配置 apache 超集以通过 LDAP 连接到 presto 的正确方法是什么?
- python - threading code.InteractiveInterpreter 并在执行命令时获取输出
- ffmpeg - ffmpeg推视频成功了,为什么一开始就出错了?
- java - 使用构造函数注入的组件测试问题
- python - 如何使用网页上的按钮调用类的方法 - Django -python
- amazon-web-services - VPN 站点到站点选项中的“内部隧道 IPv4 CIDR”是什么意思?
- reactjs - 我应该如何解决“预计在箭头函数结束时返回一个值。”?