Ответ
Веб-фреймворк Gin предоставляет удобные инструменты для работы с различными форматами данных как в теле запроса, так и в ответе. Ключевые форматы:
-
JSON — самый распространенный формат для REST API. Gin умеет автоматически парсить (bind) JSON из тела запроса в Go-структуры и сериализовывать структуры в JSON-ответ.
type User struct { Name string `json:"name" binding:"required"` Age int `json:"age"` } router.POST("/user", func(c *gin.Context) { var user User // ShouldBindJSON парсит тело запроса в структуру. if err := c.ShouldBindJSON(&user); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // c.JSON сериализует структуру и отправляет с кодом 200. c.JSON(http.StatusOK, user) }) -
Данные форм (Form-Data и x-www-form-urlencoded) — для данных, отправленных из HTML-форм, и параметров из URL (query parameters).
router.POST("/form", func(c *gin.Context) { // Данные из тела формы name := c.PostForm("name") // Данные из строки запроса (?age=25) // DefaultQuery позволяет задать значение по умолчанию. age := c.DefaultQuery("age", "18") c.String(http.StatusOK, "Name: %s, Age: %s", name, age) }) -
XML — поддерживается аналогично JSON для парсинга и генерации XML-ответов.
// Отправка XML-ответа c.XML(http.StatusOK, gin.H{"status": "success", "message": "pong"}) -
YAML — Gin не имеет встроенной поддержки YAML, но его можно легко интегрировать, используя сторонние библиотеки (например,
gopkg.in/yaml.v2) для парсинга тела запроса или формирования ответа. -
Бинарные данные (Raw Data) — для обработки файлов, изображений или любых других бинарных данных можно использовать
c.GetRawData()для чтения иc.Data()для отправки.
Gin также позволяет создавать собственные рендереры и биндеры для поддержки любых других форматов.
Ответ 18+ 🔞
А, слушай, смотри, этот ваш Gin, ну, фреймворк, блядь... Он там с данными, сука, как хочешь, так и работает, внатуре. Форматов — овердохуища, и для каждого свой подход, блядь. Главное — не перепутать, а то получишь пиздец, а не ответ.
Вот, например, JSON — это святое, ёпта. Все эти ваши REST API на нём сидят. Ты ему структуру свою подсовываешь, а он её, сука, сам из запроса выковыривает и обратно в JSON плюёт. Красота!
type User struct {
Name string `json:"name" binding:"required"`
Age int `json:"age"`
}
router.POST("/user", func(c *gin.Context) {
var user User
// ShouldBindJSON — это как волшебная палочка, блядь. Парсит JSON в структуру.
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// А тут он эту структуру обратно в JSON заворачивает и шлёт.
c.JSON(http.StatusOK, user)
})
Дальше, данные форм — это когда с фронтенда, блядь, какая-нибудь хитрая жопа-форма прилетает. Или параметры в URL, эти самые ?age=25&name=Vasya. Тут тоже всё просто, как три копейки.
router.POST("/form", func(c *gin.Context) {
// Из тела формы вытаскиваем
name := c.PostForm("name")
// А это из строки запроса (то, что после знака вопроса)
// DefaultQuery — если хуй там ничего нет, подставит "18", умная жопа.
age := c.DefaultQuery("age", "18")
c.String(http.StatusOK, "Name: %s, Age: %s", name, age)
})
XML — ну, для любителей старой школы, блядь. Работает почти так же, как и JSON, только пахнет по-другому. c.XML — и поехали.
// Отправляем XML, будто это две тысячи какой-то год.
c.XML(http.StatusOK, gin.H{"status": "success", "message": "pong"})
А вот YAML — тут, сука, самодеятельность начинается. Встроенной поддержки нет, ну и хуй с ним! Берёшь библиотеку стороннюю, какую-нибудь yaml.v2, и колдуешь. Gin-то тебе не мешает, он даёт доступ к сырым данным — делай что хошь, блядь.
Ну и наконец, бинарные данные — файлы, картинки, да что угодно, ёпта. Читаешь всё подряд через c.GetRawData(), а отправить можно через c.Data(). Прям как труба, блядь, в одну сторону засосал, в другую выдавил.
И самое охуенное — если тебе мало этих форматов, ты можешь, сука, свои собственные рендереры и биндеры накрутить. Хоть на азбуке Морзе ответы отдавай, Gin не против, блядь. Главное — код писать правильно, а не как мартышлюшка.