# #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, можете ли вы сказать мне, какая часть неверна? Отредактировал вопрос спасибо