美文网首页
golang echo(二)---请求与响应

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

作者: lannisiter | 来源:发表于2020-08-23 22:20 被阅读0次

    上一章节介绍了使用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)      //查询
    }
    

    相关文章

      网友评论

          本文标题:golang echo(二)---请求与响应

          本文链接:https://www.haomeiwen.com/subject/jjwwjktx.html