GUIDE(指引) - HTTP 响应

优质
小牛编辑
126浏览
2023-12-01

HTTP 响应

发送 string 数据

Context#String(code int, s string) 用于发送一个带有状态码的纯文本响应。

  1. func(c echo.Context) error {
  2. return c.String(http.StatusOK, "Hello, World!")
  3. }

发送 HTML 响应

Context#HTML(code int, html string) 用于发送一个带状态码的简单 html 响应。如果你需要动态生成 html 内容请查看模版。

  1. func(c echo.Context) error {
  2. return c.HTML(http.StatusOK, "<strong>Hello, World!</strong>")
  3. }

发送 HTML Blog

Context#HTMLBlob(code int, b []byte) 用于发送一个带状态码的 html blob(二进制大对象)响应。它和输出 []byte 类型内容的模版引擎配合使用非常方便。

模版引擎渲染

查看

发送 JSON 数据

Context#JSON(code int, i interface{}) 用于发送一个带状态码的 json 对象。它会将 golang 的对象转换成 json 字符串。

  1. // User
  2. type User struct {
  3. Name string `json:"name" xml:"name"`
  4. Email string `json:"email" xml:"email"`
  5. }
  6. // Handler
  7. func(c echo.Context) error {
  8. u := &User{
  9. Name: "Jon",
  10. Email: "jon@labstack.com",
  11. }
  12. return c.JSON(http.StatusOK, u)
  13. }

JSON 流

Context#JSON() 内部使用 json.Marshl 来转换 json 数据,对于多大的数据来说性能不够好,这种情况你可以直接使用 json 流。

  1. func(c echo.Context) error {
  2. u := &User{
  3. Name: "Jon",
  4. Email: "jon@labstack.com",
  5. }
  6. c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
  7. c.Response().WriteHeader(http.StatusOK)
  8. return json.NewEncoder(c.Response()).Encode(u)
  9. }

JSON Pretty

Context#JSONPretty(code int, i interface{}, indent string) 也是用于发送 json 数据。不过它打印出的 json 数据带有锁进(可以使用空格和 tab),更为好看。

发送带有空格锁进的 json 数据。

  1. func(c echo.Context) error {
  2. u := &User{
  3. Name: "Jon",
  4. Email: "joe@labstack.com",
  5. }
  6. return c.JSONPretty(http.StatusOK, u, " ")
  7. }
  1. {
  2. "email": "joe@labstack.com",
  3. "name": "Jon"
  4. }

JSON Blob

Context#JSONBlob(code int, b []byte) 用来直接发送一个已经转换好的 json 对象。

  1. func(c echo.Context) error {
  2. encodedJSON := []byte{} // Encoded JSON from external source
  3. return c.JSONBlob(http.StatusOK, encodedJSON)
  4. }

发送 JSONP 数据

Context#JSONP(code int, callback string, i interface{}) 用来把 golang 的数据类型转换成 json 并通过回调以 jsonp 的结构发送出去。

示例

发送 XML 数据

Context#XML(code int, i interface{}) 用来转换 golang 对象为 xml 数据发送响应。

  1. func(c echo.Context) error {
  2. u := &User{
  3. Name: "Jon",
  4. Email: "jon@labstack.com",
  5. }
  6. return c.XML(http.StatusOK, u)
  7. }

Stream XML

  1. func(c echo.Context) error {
  2. u := &User{
  3. Name: "Jon",
  4. Email: "jon@labstack.com",
  5. }
  6. c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationXMLCharsetUTF8)
  7. c.Response().WriteHeader(http.StatusOK)
  8. return xml.NewEncoder(c.Response()).Encode(u)
  9. }

XML Pretty

Context#XMLPretty(code int, i interface{}, indent string)

  1. func(c echo.Context) error {
  2. u := &User{
  3. Name: "Jon",
  4. Email: "joe@labstack.com",
  5. }
  6. return c.XMLPretty(http.StatusOK, u, " ")
  7. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <User>
  3. <Name>Jon</Name>
  4. <Email>joe@labstack.com</Email>
  5. </User>

XML Blob

Context#XMLBlob(code int, b []byte)

  1. func(c echo.Context) error {
  2. encodedXML := []byte{} // Encoded XML from external source
  3. return c.XMLBlob(http.StatusOK, encodedXML)
  4. }

发送文件

Context#File(file string) 用来发送一个文件为内容的响应。

  1. func(c echo.Context) error {
  2. return c.File("<文件路径>")
  3. }

发送附件

Context#Attachment(file, name string) 和发送文件的方法类似,只是它会多提供一个名称。

  1. func(c echo.Context) error {
  2. return c.Attachment("<PATH_TO_YOUR_FILE>")
  3. }

Send Inline

Context#Inline(file, name string)

  1. func(c echo.Context) error {
  2. return c.Inline("<PATH_TO_YOUR_FILE>")
  3. }

Send Blob

`Context#Blob(code int, contentType string, b []byte) 用来发送任意类型的数据。需要提供 content type。

  1. func(c echo.Context) (err error) {
  2. data := []byte(`0306703,0035866,NO_ACTION,06/19/2006
  3. 0086003,"0005866",UPDATED,06/19/2006`)
  4. return c.Blob(http.StatusOK, "text/csv", data)
  5. }

发送流数据

Context#Stream(code int, contentType string, r io.Reader) 用来发送任意数据流响应。需要提供 content type,io.Reader 和状态码。

  1. func(c echo.Context) error {
  2. f, err := os.Open("<PATH_TO_IMAGE>")
  3. if err != nil {
  4. return err
  5. }
  6. return c.Stream(http.StatusOK, "image/png", f)
  7. }

发送空内容

Context#NoContent(code int)

  1. func(c echo.Context) error {
  2. return c.NoContent(http.StatusOK)
  3. }

重定向

Context#Redirect(code int, url string),提供一个 url 用于重定向。

  1. func(c echo.Context) error {
  2. return c.Redirect(http.StatusMovedPermanently, "<URL>")
  3. }