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) //查询
}