wego框架中请求参数可以使用一个统一的Param对象来获取,Param对象可获取以下类型的参数:
在wego中通过c.Param.GetXXX函数来获取请求参数:
func TestGetParam(t *testing.T) {
web, _ := NewWeb()
web.GET("/user", func(c *WebContext) {
name := c.Param.GetString("name")
if name.Error != nil {
t.Error(name.Error)
}
age := c.Param.GetInt("age")
if age.Error != nil {
t.Error(age.Error)
}
c.WriteText(200, name.Value)
})
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/user?name=lisi&age=12", nil)
web.ServeHTTP(w, req)
}
为了方便获取各种类型的参数,wego提供了一些列GetXXX函数用于参数的获取:
GetXXX函数没有直接返回XXX类型的值,例如GetInt返回的不是int类型的值,而是一个ValidInt的类型的值:
type ValidInt struct {
Value int
Error error
}
其中的Value参数的值,Error通常为不存在该参数错误,或者是类型转换错误。例如在使用GetInt(key)来查询一个参数时,若不存在指定的参数,或者时参数不能转换为int类型,则ValidInt的Value的值为0,并且会将错误信息赋值给ValidInt的Error字段。
MustXXX函数直接返回对应类型的值,使用起来更加便捷。在使用MustXXX函数查询参数时,若不存在指定的参数,或者是类型转换错误,并且在调用时提供了缺省值,则返回缺省值,否则返回对应类型的"0"值:
func TestParamMust(t *testing.T) {
web, _ := NewWeb()
web.GET("/user", func(c *WebContext) {
name := c.Param.MustString("name")
t.Log(name)
age := c.Param.MustInt("age")
t.Log(age)
})
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/user?name=lisi&age=12", nil)
web.ServeHTTP(w, req)
}
在wego中可通过WebContext.RouteParam.GetXXX来获取路径参数:
func TestGetPathParam(t *testing.T) {
web, _ := NewWeb()
web.GET("/hello/:id", func(c *WebContext) {
ret := c.RouteParam.GetString("id")
if ret.Error != nil {
t.Error(ret.Error)
}
t.Log(ret.Value)
})
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/hello/123", nil)
web.ServeHTTP(w, req)
}
在wego中通过WebContext.QueryParam.GetXXX来获取URL查询参数:
func TestGetQueryParamGet(t *testing.T) {
web, _ := NewWeb()
web.GET("/user", func(c *WebContext) {
name := c.QueryParam.GetString("name").Value
age := c.QueryParam.GetInt("age").Value
t.Log(name)
t.Log(age)
})
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/user?name=lisi&age=12", nil)
web.ServeHTTP(w, req)
}
在wego中WebContext.FormParam.GetXXX来获取Form参数:
func TestGetFromParamGet(t *testing.T) {
web, _ := NewWeb()
web.POST("/user", func(c *WebContext) {
name := c.FormParam.GetString("name").Value
age := c.FormParam.GetInt("age").Value
t.Log(name)
t.Log(age)
})
var buff bytes.Buffer
buff.WriteString("name=lisi&age=12")
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", "/user", &buff)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
web.ServeHTTP(w, req)
}
除了上面所列的参数获取方式,wego还提供了参数绑定的方式来获取参数:使用GetStruct方法将HTTP请求参数直接绑定到struct对象。GetStruct函数会根据struct的字段名称或者是字段的tag名称来获取请求参数的值。例如:
type FormUser struct {
Name string `form:"name"`
Age int
}
func TestGetStruct(t *testing.T) {
web, _ := NewWeb()
web.POST("/user", func(c *WebContext) {
var user FormUser
err := c.Param.GetStruct(&user)
if err != nil {
t.Log(err)
}
t.Log(user)
})
var buff bytes.Buffer
buff.WriteString("name=lisi&Age=12")
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", "/user", &buff)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
web.ServeHTTP(w, req)
}
若POST请求中Body的数据的格式为JSON格式,可以直接使用ReadJSON()函数来读取:
func TestReadJson(t *testing.T) {
web, _ := NewWeb()
web.POST("/user", func(c *WebContext) {
var user2 User
err := c.ReadJSON(&user2)
if err != nil {
t.Log(err)
}
t.Log(user2)
})
user := User{}
user.ID = 1
user.Name = "demo"
user.Age = 12
data, _ := json.Marshal(user)
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", "/user", bytes.NewBuffer(data))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
web.ServeHTTP(w, req)
}
若POST请求中Body的数据的格式为XML格式,可以直接使用ReadXML函数来读取:
func TestReadXML(t *testing.T) {
web, _ := NewWeb()
web.POST("/user", func(c *WebContext) {
var user2 User
err := c.ReadXML(&user2)
if err != nil {
t.Log(err)
}
t.Log(user2)
})
user := User{}
user.ID = 1
user.Name = "demo"
user.Age = 12
data, _ := xml.Marshal(user)
w := httptest.NewRecorder()
req, _ := http.NewRequest("POST", "/user", bytes.NewBuffer(data))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
web.ServeHTTP(w, req)
}
wego框架提供了两个很方便的函数来处理上传文件:
用于读取表单中的文件信息
用于实现快速保存文件到本地路径
示例代码:
<html lang="en">
<head>
<meta charset="utf-8">
<title>file upload</title>
</head>
<body>
<h1>上传文件</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
文件: <input type="file" name="file"><br><br>
<input type="submit" value="上传文件">
</form>
</body>
</html>
func upload(c *wego.WebContext) {
fh, err := c.GetFile("file")
if err != nil {
log.Error(err)
c.AbortWithError(500, err)
return
}
file, err := fh.Open()
if err != nil {
log.Error(err)
c.AbortWithError(500, err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
log.Error(err)
c.AbortWithError(500, err)
return
}
c.WriteText(200, string(data))
}