Response
Um handler escreve sua response por meio do echo.Context. Cada helper define o
Content-Type e o código de status apropriados para você.
Enviar string
Seção intitulada “Enviar string”Context#String(code int, s string) envia uma response de texto simples com um código de status.
func(c *echo.Context) error { return c.String(http.StatusOK, "Hello, World!")}Enviar HTML
Seção intitulada “Enviar HTML”Context#HTML(code int, html string) envia uma response HTML simples com um código de
status. Para gerar HTML dinamicamente, veja Templates.
func(c *echo.Context) error { return c.HTML(http.StatusOK, "<strong>Hello, World!</strong>")}Enviar blob HTML
Seção intitulada “Enviar blob HTML”Context#HTMLBlob(code int, b []byte) envia um blob HTML com um código de status. Ele é
útil com um mecanismo de templates que produz []byte.
func handler(c *echo.Context) error { blob := []byte("<strong>Hello, World!</strong>") return c.HTMLBlob(http.StatusOK, blob)}Renderizar template
Seção intitulada “Renderizar template”Veja Templates.
Enviar JSON
Seção intitulada “Enviar JSON”Context#JSON(code int, i any) codifica um valor Go como JSON e o envia com um
código de status.
type User struct { Name string `json:"name" xml:"name"` Email string `json:"email" xml:"email"`}
func(c *echo.Context) error { u := &User{ Name: "Jon", } return c.JSON(http.StatusOK, u)}Stream JSON
Seção intitulada “Stream JSON”Context#JSON() usa json.Marshal internamente, o que pode ser ineficiente para payloads grandes.
Nesse caso, envie o JSON diretamente como stream:
func(c *echo.Context) error { u := &User{ Name: "Jon", } c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) c.Response().WriteHeader(http.StatusOK) return json.NewEncoder(c.Response()).Encode(u)}JSON pretty
Seção intitulada “JSON pretty”Context#JSONPretty(code int, i any, indent string) envia uma response JSON formatada.
O indent pode ser espaços ou tabs.
func(c *echo.Context) error { u := &User{ Name: "Jon", } return c.JSONPretty(http.StatusOK, u, " ")}{ "name": "Jon"}Blob JSON
Seção intitulada “Blob JSON”Context#JSONBlob(code int, b []byte) envia um blob JSON pré-codificado diretamente, por
exemplo vindo de um banco de dados.
func(c *echo.Context) error { encodedJSON := []byte{} // Encoded JSON from an external source. return c.JSONBlob(http.StatusOK, encodedJSON)}Enviar JSONP
Seção intitulada “Enviar JSONP”Context#JSONP(code int, callback string, i any) codifica um valor Go como JSON e
o envia como um payload JSONP envolvido no callback informado.
func handler(c *echo.Context) error { callback := c.QueryParam("callback")}Veja a receita de JSONP.
Enviar XML
Seção intitulada “Enviar XML”Context#XML(code int, i any) codifica um valor Go como XML e o envia com um código
de status.
func(c *echo.Context) error { u := &User{ Name: "Jon", } return c.XML(http.StatusOK, u)}Stream XML
Seção intitulada “Stream XML”Context#XML usa xml.Marshal internamente, o que pode ser ineficiente para payloads grandes.
Nesse caso, envie o XML diretamente como stream:
func(c *echo.Context) error { u := &User{ Name: "Jon", } c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationXMLCharsetUTF8) c.Response().WriteHeader(http.StatusOK) return xml.NewEncoder(c.Response()).Encode(u)}XML pretty
Seção intitulada “XML pretty”Context#XMLPretty(code int, i any, indent string) envia uma response XML formatada.
O indent pode ser espaços ou tabs.
func(c *echo.Context) error { u := &User{ Name: "Jon", } return c.XMLPretty(http.StatusOK, u, " ")}<?xml version="1.0" encoding="UTF-8"?><User> <Name>Jon</Name></User>Blob XML
Seção intitulada “Blob XML”Context#XMLBlob(code int, b []byte) envia um blob XML pré-codificado diretamente, por
exemplo vindo de um banco de dados.
func(c *echo.Context) error { encodedXML := []byte{} // Encoded XML from an external source. return c.XMLBlob(http.StatusOK, encodedXML)}Enviar arquivo
Seção intitulada “Enviar arquivo”Context#File(file string) envia o conteúdo de um arquivo como a response. Ele define
o tipo de conteúdo correto e lida com cache automaticamente.
func(c *echo.Context) error { return c.File("<PATH_TO_YOUR_FILE>")}Enviar attachment
Seção intitulada “Enviar attachment”Context#Attachment(file, name string) é como File(), mas envia o arquivo com
Content-Disposition: attachment e o nome informado.
func(c *echo.Context) error { return c.Attachment("<PATH_TO_YOUR_FILE>", "<ATTACHMENT_NAME>")}Enviar inline
Seção intitulada “Enviar inline”Context#Inline(file, name string) é como File(), mas envia o arquivo com
Content-Disposition: inline e o nome informado.
func(c *echo.Context) error { return c.Inline("<PATH_TO_YOUR_FILE>", "<INLINE_NAME>")}Enviar blob
Seção intitulada “Enviar blob”Context#Blob(code int, contentType string, b []byte) envia dados arbitrários com um
tipo de conteúdo e código de status informados.
func(c *echo.Context) error { data := []byte(`0306703,0035866,NO_ACTION,06/19/20060086003,"0005866",UPDATED,06/19/2006`) return c.Blob(http.StatusOK, "text/csv", data)}Enviar stream
Seção intitulada “Enviar stream”Context#Stream(code int, contentType string, r io.Reader) envia um stream de dados
arbitrário com um tipo de conteúdo, io.Reader e código de status informados.
func(c *echo.Context) error { f, err := os.Open("<PATH_TO_IMAGE>") if err != nil { return err } defer f.Close() return c.Stream(http.StatusOK, "image/png", f)}Enviar sem conteúdo
Seção intitulada “Enviar sem conteúdo”Context#NoContent(code int) envia um body vazio com um código de status.
func(c *echo.Context) error { return c.NoContent(http.StatusOK)}Redirecionar request
Seção intitulada “Redirecionar request”Context#Redirect(code int, url string) redireciona o request para a URL informada com
um código de status.
func(c *echo.Context) error { return c.Redirect(http.StatusMovedPermanently, "<URL>")}Antes da response
Seção intitulada “Antes da response”Response#Before(func()) registra uma função que roda pouco antes de a response ser
escrita.
Depois da response
Seção intitulada “Depois da response”Response#After(func()) registra uma função que roda logo depois de a response ser
escrita. Se o Content-Length for desconhecido, nenhuma função after roda.
e.GET("/hooks", func(c *echo.Context) error { resp, err := echo.UnwrapResponse(c.Response()) if err != nil { return err } resp.Before(func() { println("before response") }) resp.After(func() { println("after response") }) return c.String(http.StatusOK, "Hello, World!")})