## 響應
### 發送 string 數據
`Context#String(code int, s string)` 用于發送一個帶有狀態碼的純文本響應。
*示例*
```go
func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
}
```
### 發送 HTML 響應 (參考模板)
`Context#HTML(code int, html string)` 用于發送一個帶有狀態碼的簡單 HTML 響應。如果你需要動態生成 HTML 內容請查看[模版](https://echo.labstack.com/guide/templates)。
*示例*
```go
func(c echo.Context) error {
return c.HTML(http.StatusOK, "<strong>Hello, World!</strong>")
}
```
#### 發送 HTML Blob
`Context#HTMLBlob(code int, b []byte)` 用于發送一個帶狀態碼的 HTML blob(二進制長對象)響應。可以發現,使用輸出 `[]byte` 的模版引擎很方便。
### 模版引擎渲染
[查看](https://echo.labstack.com/guide/templates)
### 發送 JSON 數據
`Context#JSON(code int, i interface{})` 用于發送一個帶狀態碼的 JSON 對象,它會將 Golang 的對象轉換成 JSON 字符串。
*示例*
```go
// User
type User struct {
Name string `json:"name" xml:"name"`
Email string `json:"email" xml:"email"`
}
// Handler
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "jon@labstack.com",
}
return c.JSON(http.StatusOK, u)
}
```
#### JSON 流
`Context#JSON()` 內部使用 `json.Marshal` 來轉換 JSON 數據,但該方法面對大量的 JSON 數據會顯得效率不足,對于這種情況可以直接使用 JSON 流。
*示例*
```go
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "jon@labstack.com",
}
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
c.Response().WriteHeader(http.StatusOK)
return json.NewEncoder(c.Response()).Encode(u)
}
```
#### JSON 美化 (JSON Pretty)
`Context#JSONPretty(code int, i interface{}, indent string)` 可以發送帶有縮進(可以使用空格和 tab)的更為好看的 JSON 數據。
*示例*
```go
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "joe@labstack.com",
}
return c.JSONPretty(http.StatusOK, u, " ")
}
```
```go
{
"email": "joe@labstack.com",
"name": "Jon"
}
```
> 通過在請求URL查詢字符串中附加 `pretty` ,你也可以使用 `Context#JSON()` 來輸出帶有縮進的 JSON 數據。
*示例*
```bash
curl http://localhost:1323/users/1?pretty
```
#### JSON Blob
`Context#JSONBlob(code int, b []byte)` 可用來從外部源(例如數據庫)直接發送預編碼的 JSON 對象。
*示例*
```go
func(c echo.Context) error {
encodedJSON := []byte{} // Encoded JSON from external source
return c.JSONBlob(http.StatusOK, encodedJSON)
}
```
### 發送 JSONP 數據
`Context#JSONP(code int, callback string, i interface{})` 可以將 Golang 的數據類型轉換成 JSON 類型,并通過回調以帶有狀態碼的 JSONNP 結構發送。
[查看示例](https://echo.labstack.com/cookbook/jsonp)
### 發送 XML 數據
`Context#XML(code int, i interface{})` 可以將 Golang 對象轉換成 XML 類型,并帶上狀態碼發送響應。
*示例*
```go
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "jon@labstack.com",
}
return c.XML(http.StatusOK, u)
}
```
#### XML 流
`Context#XML` 內部使用 `xml.Marshal` 來轉換 XML 數據,但該方法面對大量的 XML 數據會顯得效率不足,對于這種情況可以直接使用 XML 流。
*示例*
```go
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "jon@labstack.com",
}
c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationXMLCharsetUTF8)
c.Response().WriteHeader(http.StatusOK)
return xml.NewEncoder(c.Response()).Encode(u)
}
```
#### XML 美化 (XML Pretty)
`Context#XMLPretty(code int, i interface{}, indent string)` 可以發送帶有縮進(可以使用空格和 tab)的更為好看的 XML 數據。
*示例*
```go
func(c echo.Context) error {
u := &User{
Name: "Jon",
Email: "joe@labstack.com",
}
return c.XMLPretty(http.StatusOK, u, " ")
}
```
```xml
<?xml version="1.0" encoding="UTF-8"?>
<User>
<Name>Jon</Name>
<Email>joe@labstack.com</Email>
</User>
```
> 通過在請求URL查詢字符串中附加 `pretty` ,你也可以使用 `Context#XML()` 來輸出帶有縮進的 XML 數據。
*示例*
```bash
curl http://localhost:1323/users/1?pretty
```
#### XML Blob
`Context#XMLBlob(code int, b []byte)` 可用來從外部源(例如數據庫)直接發送預編碼的 XML 對象。
*示例*
```go
func(c echo.Context) error {
encodedXML := []byte{} // Encoded XML from external source
return c.XMLBlob(http.StatusOK, encodedXML)
}
```
### 發送文件
`Context#File(file string)` 可用來發送內容為文件的響應,并且它能自動設置正確的內容類型、優雅地處理緩存。
*示例*
```go
func(c echo.Context) error {
return c.File("<文件路徑>")
}
```
### 發送附件
`Context#Attachment(file, name string)` 和發送文件 `File()` 的方法類似,只是它的方法名稱不同。
*示例*
```go
func(c echo.Context) error {
return c.Attachment("<PATH_TO_YOUR_FILE>")
}
```
### 發送內嵌 (Inline)
`Context#Inline(file, name string)` 和發送文件 `File()` 的方法類似,只是它的方法名稱不同。
*示例*
```go
func(c echo.Context) error {
return c.Inline("<PATH_TO_YOUR_FILE>")
}
```
### 發送二進制長文件 (Blob)
``Context#Blob(code int, contentType string, b []byte)`? 可用于發送帶有內容類型 (content type) 和狀態代碼的任意類型數據。
*示例*
```go
func(c echo.Context) (err error) {
data := []byte(`0306703,0035866,NO_ACTION,06/19/2006
0086003,"0005866",UPDATED,06/19/2006`)
return c.Blob(http.StatusOK, "text/csv", data)
}
```
### 發送流 (Stream)
`Context#Stream(code int, contentType string, r io.Reader)` 可用于發送帶有內容類型 (content type) 、狀態代碼、`io.Reader` 的任意類型數據流。
*示例*
```go
func(c echo.Context) error {
f, err := os.Open("<PATH_TO_IMAGE>")
if err != nil {
return err
}
return c.Stream(http.StatusOK, "image/png", f)
}
```
### 發送空內容 (No Content)
`Context#NoContent(code int)` 可用于發送帶有狀態碼的空內容。
*示例*
```go
func(c echo.Context) error {
return c.NoContent(http.StatusOK)
}
```
### 重定向
`Context#Redirect(code int, url string)` 可用于重定向至一個帶有狀態碼的 URL。
*示例*
```go
func(c echo.Context) error {
return c.Redirect(http.StatusMovedPermanently, "<URL>")
}
```
### Hooks
#### 響應之前
`Context#Response#Before(func())` 可以用來注冊在寫入響應之前調用的函數。
#### 響應之后
`Context#Response#After(func())` 可以用來注冊在寫入響應之后調用的函數。但是如果 “Content-Length” 是未知狀態,則不會有任何方法會被執行。
*示例*
```go
func(c echo.Context) error {
c.Response().Before(func() {
println("before response")
})
c.Response().After(func() {
println("after response")
})
return c.NoContent(http.StatusNoContent)
}
```
> 可以在響應之前與之后注冊多個方法