HTTP 请求

数据绑定

使用 Context#Bind(i interface{}) 绑定一个请求内容体到 go 的结构体。默认的绑定器支持解析 Content-Type 是 application/json,application/xml 和 application/x-www-form-urlencoded 的数据。

下面是绑定请求数据到 User 结构体的例子

  1. // User
  2. User struct {
  3. Name string `json:"name" form:"name" query:"name"`
  4. Email string `json:"email" form:"email" query:"email"`
  5. }
  1. // Handler
  2. func(c echo.Context) (err error) {
  3. u := new(User)
  4. if err = c.Bind(u); err != nil {
  5. return
  6. }
  7. return c.JSON(http.StatusOK, u)
  8. }

JSON 数据

  1. curl \
  2. -X POST \
  3. http://localhost:1323/users \
  4. -H 'Content-Type: application/json' \
  5. -d '{"name":"Joe","email":"joe@labstack"}'

From 表单数据

  1. curl \
  2. -X POST \
  3. http://localhost:1323/users \
  4. -d 'name=Joe' \
  5. -d 'email=joe@labstack.com'

url 请求数据 (Query Parameters)

  1. curl \
  2. -X GET \
  3. http://localhost:1323/users\?name\=Joe\&email\=joe@labstack.com

自定义绑定器

可以通过 Echo#Binder自定义绑定器。

示例

  1. type CustomBinder struct {}
  2. func (cb *CustomBinder) Bind(i interface{}, c echo.Context) (err error) {
  3. // 你也许会用到默认的绑定器
  4. db := new(echo.DefaultBinder)
  5. if err = db.Bind(i, c); err != echo.ErrUnsupportedMediaType {
  6. return
  7. }
  8. // 做你自己的实现
  9. return
  10. }

读取数据

Form 表达数据

表单数据可以通过名称读取,使用这个方法 Context#FormValue(name string)

示例

  1. // Handler
  2. func(c echo.Context) error {
  3. name := c.FormValue("name")
  4. return c.String(http.StatusOK, name)
  5. }
  1. curl \
  2. -X POST \
  3. http://localhost:1323 \
  4. -d 'name=Joe'

你可以实现 Echo#BindUnmarshaler 接口去去绑定自己的数据结构。

  1. type Timestamp time.Time
  2. func (t *Timestamp) UnmarshalParam(src string) error {
  3. ts, err := time.Parse(time.RFC3339, src)
  4. *t = Timestamp(ts)
  5. return err
  6. }

url 请求数据 (Query Parameters)

url 请求参数可以通过名称获取,使用 Context#QueryParam(name string) 方法。

示例

  1. // Handler
  2. func(c echo.Context) error {
  3. name := c.QueryParam("name")
  4. return c.String(http.StatusOK, name)
  5. })
  1. curl \
  2. -X GET \
  3. http://localhost:1323\?name\=Joe

和表单数据一样,自定义数据也可以通过 Context#QueryParam(name string) 绑定。

url 请求参数 (Path Parameters)

url 请求参数可以通过 Context#Param(name string) string 获取。

示例

  1. e.GET("/users/:name", func(c echo.Context) error {
  2. name := c.Param("name")
  3. return c.String(http.StatusOK, name)
  4. })
  1. $ curl http://localhost:1323/users/Joe

数据验证

Echo 没有内置数据验证功能,但是可以通过 Echo#Validator第三方库自己注册一个数据验证器。

下面例子 https://github.com/go-playground/validator 使用做验证

  1. type (
  2. User struct {
  3. Name string `json:"name" validate:"required"`
  4. Email string `json:"email" validate:"required,email"`
  5. }
  6. CustomValidator struct {
  7. validator *validator.Validate
  8. }
  9. )
  10. func (cv *CustomValidator) Validate(i interface{}) error {
  11. return cv.validator.Struct(i)
  12. }
  13. func main() {
  14. e := echo.New()
  15. e.Validator = &CustomValidator{validator: validator.New()}
  16. e.POST("/users", func(c echo.Context) (err error) {
  17. u := new(User)
  18. if err = c.Bind(u); err != nil {
  19. return
  20. }
  21. if err = c.Validate(u); err != nil {
  22. return
  23. }
  24. return c.JSON(http.StatusOK, u)
  25. })
  26. e.Logger.Fatal(e.Start(":1323"))
  27. }
  1. curl \
  2. -X POST \
  3. http://localhost:1323/users \
  4. -H 'Content-Type: application/json' \
  5. -d '{"name":"Joe","email":"joe@invalid-domain"}'
  6. {"message":"Key: 'User.Email' Error:Field validation for 'Email' failed on the 'email' tag"}