golang echo(二)---请求与响应

2020-08-23  本文已影响0人  lannisiter

上一章节介绍了使用echo启动一个http服务器并提供一个简单的GET接口,这一章对请求与响应做一下详细的讲解。

Context

了解请求与响应之前首先要知道ehco框架提供了一个Context接口,Context 表示当前 HTTP 请求的上下文,我们需要知道的是Context的实现结构体context,context中包含了请求(request)、响应(response)以及参数等结构体,context是一个内部结构体,但是对外提供了访问的方法,我们可以在开发中使用context提供的方法做很多事情,比如获取请求路径、客户端ip、请求参数等等。

    context struct {
        request  *http.Request
        response *Response
        path     string
        pnames   []string
        pvalues  []string
        query    url.Values
        handler  HandlerFunc
        store    Map
        echo     *Echo
        logger   Logger
        lock     sync.RWMutex
    }
)
//我这里展示部分方法
//获取当前request
func (c *context) Request() *http.Request {
    return c.request
}
//获取当前response
func (c *context) Response() *Response {
    return c.response
}
//获取url参数
func (c *context) QueryParam(name string) string {
    if c.query == nil {
        c.query = c.request.URL.Query()
    }
    return c.query.Get(name)
}
//获取表单参数
func (c *context) FormValue(name string) string {
    return c.request.FormValue(name)
}

request

request是包含了当前请求信息的结构体,我们从中可以获取到前后端约定好的参数来作出相应的业务逻辑,这下面开始模拟请求

//在实体类中编写结构体
type User struct {
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Gender  int     `json:"gender"`     //1:男、2:女
}
//封装返回结果结构体
type Result struct {
    Code    int
    Msg     string
    Data    interface{}
}
func Success(msg string, data interface{}) Result {
    return Result{
        Code: 10000,
        Msg:  msg,
        Data: data,
    }
}

func Fail(msg string, data interface{}) Result {
    return Result{
        Code: 10002,
        Msg:  msg,
        Data: data,
    }
}

首先模拟一个添加用户的POST请求,这里使用了c.bind()这个方法,这个方法起到的作用是把表单参数或者JSON参数绑定至对应的结构体(这里必须是指针类型),字段需要一一对应,也就是说前端需要传递的表单或JSON参数名为name、age、gender才能绑定到结构体中。

//handler中接收并处理请求
func Add(c echo.Context) error {
    user := new(entity.User)
    err := c.Bind(user)
    if err != nil {
        return c.JSON(http.StatusOK,result.Fail("请输入正确参数!",nil))
    }
    return c.JSON(http.StatusOK,result.Success("添加成功",user))
}
1.jpg

接下来模拟一个GET请求用来获取用户信息

func Get(c echo.Context) error {
    name := c.QueryParam("name")
    if name == "" {
        return c.JSON(http.StatusOK,result.Fail("请输入正确参数!",nil))
    }
    /*这里编写自己的业务逻辑用来查询数据库*/
    //我这里直接模拟返回
    user := entity.User{
        Name:   "tom",
        Age:    18,
        Gender: 1,
    }
    return c.JSON(http.StatusOK,result.Success("查询成功",user))
}
2.jpg

response

response是包含了返回信息的结构体,echo提供了多种类型的返回结果

//用于发送一个带有状态码的纯文本响应。
func(c echo.Context) error {
  return c.String(http.StatusOK, "Hello, World!")
}
//用于发送一个带有状态码的简单 HTML 响应。
func(c echo.Context) error {
  return c.HTML(http.StatusOK, "<strong>Hello, World!</strong>")
}
//用于发送一个带状态码的 JSON 对象,它会将 Golang 的对象转换成 JSON 字符串。
//也就是我上面的示例,一般用于前后端分离的项目,也是主流
func(c echo.Context) error {
  return c.JSON(http.StatusOK, user)
}

路由

上面编写了处理请求的handler,这里介绍一下如何把handler注册到路由中,这里对应的就是上面handler。

func AddAccount(e *echo.Echo) {
    account := e.Group("/user")
    account.POST("/add", Add)      //添加用户
    account.GET("/get", Get)      //查询
}
上一篇下一篇

猜你喜欢

热点阅读