Почему массивы не связаны волокном golang?

# #go #go-fiber

Вопрос:

Отправьте данные json в волокно golang, попробуйте привязать данные, полученные от волокна, к структуре, но это не удается,

 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)
 

результат таков amp;{title.value []} ,
Почему не удается привязаться к списку тегов??

я определил, 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 := amp;_inData{}
if err := c.BodyParser(inData); err != nil {
    return err
}
fmt.Println(inData)
 

Я получаю результат, как показано ниже, все еще не привязанный к списку тегов

 {"title":"123123","tag_list":[{"id":42,"tag_name":"234234"}, 
{"id":43,"tag_name":"345345"}]}

amp;{123123 []}
 

Я отправляю данные из flutter в волокно 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"
    },
  ),
);
 

Комментарии:

1. Не знаю, как насчет волокна, но если оно использует немаршалирование stdlib json, идентификатор во входных данных является строкой , а не uint , и это может быть причиной.

2. Ошибка, возвращенная, c.BodyParser(inData) вероятно, говорит вам, в чем дело. Всегда проверяйте и обрабатывайте ошибки.

3. срез неожиданного конца ввода JSON <

4. При использовании json.Unmarshal на входе образца ошибки нет (после исправления типа Id поля). Пожалуйста, подумайте о добавлении дополнительной отладочной информации к вашему вопросу, например, о неудачном запросе, минимальном обработчике, воспроизводящем проблему, и т. Д.

Ответ №1:

Я часто пользуюсь оптоволокном.

Причина, по которой это происходит, заключается в том, что вы не определили 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 := amp;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...

amp;{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 поддерживает декодирование параметров запроса и следующих типов контента на основе заголовка типа контента:

  • приложение/json
  • приложение/xml
  • приложение/x-www-форма-url-кодированный
  • составная часть/форма-данные

Ознакомьтесь со ссылкой ниже в официальном репозитории примеров Fiber на GitHub для получения дополнительной информации (отказ от ответственности: я написал это).

Комментарии:

1. Я не хочу ничего предполагать, но зачем вам это нужно model.MapTag , если оба MapTag и _inData существуют в одном пакете? Не могли бы вы также прояснить, о чем вы хотите спросить?

2. Я отредактировал вопрос, не могли бы вы подтвердить, пожалуйста?

3. Вы забыли json:"tag_list" , отправляете ли вы тело в виде JSON. Можете ли вы также объяснить, как вы отправили текст запроса на серверную часть?

4. Я отправляю данные с помощью flutter, можете ли вы сказать мне, какая часть неверна? Отредактировал вопрос спасибо