How to return html on Gin?

12,034

Solution 1

You can return the processed markdown byte array as a RAW Data and set content-type as text/html; charset=utf-8

This is how it may look like

router.POST("/markdown", func(c *gin.Context) {
        body, ok := c.GetPostForm("body")
        if !ok {
            c.JSON(http.StatusBadRequest, "badrequest")
            return
        }
        markdown := blackfriday.MarkdownCommon([]byte(body))
        c.Data(http.StatusOK, "text/html; charset=utf-8", markdown)
    })

Solution 2

You can also use constants for content types:

const (
    ContentTypeBinary = "application/octet-stream"
    ContentTypeForm   = "application/x-www-form-urlencoded"
    ContentTypeJSON   = "application/json"
    ContentTypeHTML   = "text/html; charset=utf-8"
    ContentTypeText   = "text/plain; charset=utf-8"
)
c.Data(http.StatusOK, ContentTypeHTML, []byte("<html></html>"))
Share:
12,034

Related videos on Youtube

AndreDurao
Author by

AndreDurao

Updated on June 15, 2022

Comments

  • AndreDurao
    AndreDurao almost 2 years

    I'm trying to render a HTML that's already on a string instead of rendering a template on Gin framework.

    The c.HTML function on GET("/") function expects a template to be rendered.

    But on POST("/markdown") I've rendered that HTML on a string already.

    How can I return it on Gin?

    package main
    
    import (
        "github.com/gin-gonic/gin"
        "github.com/russross/blackfriday"
        "log"
        "net/http"
        "os"
    )
    
    func main() {
    
        router := gin.New()
        router.Use(gin.Logger())
        router.LoadHTMLGlob("templates/*.tmpl.html")
    
        router.GET("/", func(c *gin.Context) {
            c.HTML(http.StatusOK, "index.tmpl.html", nil)
        })
    
        router.POST("/markdown", func(c *gin.Context) {
            body := c.PostForm("body")
            log.Println(body)
            markdown := blackfriday.MarkdownCommon([]byte(c.PostForm("body")))
            log.Println(markdown)
            // TODO: render markdown content on return
        })
    
        router.Run(":5000")
    }