С какими форматами данных работает фреймворк Gin?

Ответ

Веб-фреймворк Gin предоставляет удобные инструменты для работы с различными форматами данных как в теле запроса, так и в ответе. Ключевые форматы:

  1. 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)
    })
  2. Данные форм (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)
    })
  3. XML — поддерживается аналогично JSON для парсинга и генерации XML-ответов.

    // Отправка XML-ответа
    c.XML(http.StatusOK, gin.H{"status": "success", "message": "pong"})
  4. YAML — Gin не имеет встроенной поддержки YAML, но его можно легко интегрировать, используя сторонние библиотеки (например, gopkg.in/yaml.v2) для парсинга тела запроса или формирования ответа.

  5. Бинарные данные (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 не против, блядь. Главное — код писать правильно, а не как мартышлюшка.