首页 > 解决方案 > 为什么数组不绑定在 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"
    },
  ),
);

标签: gogo-fiber

解决方案


我是一个经常使用光纤的用户。

发生这种情况的原因是因为您没有在请求正文中定义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 官方示例存储库中查看以下参考资料以获取更多信息(免责声明:我写的)


推荐阅读