title: 请求 url: guide/request menu: side: parent: guide

  1. weight: 7

请求

数据绑定

可以使用 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"}'

Form 表单数据

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

查询参数 (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. }

查询参数 (Query Parameters)

查询参数可以通过名称获取,使用 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) 进行绑定。

路径参数 (Path Parameters)

路径参数可以通过 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"}