当前位置: 首页 > 工具软件 > Web.Go > 使用案例 >

Go语言WEB框架:请求参数处理

松英叡
2023-12-01

获取请求参数

wego框架中请求参数可以使用一个统一的Param对象来获取,Param对象可获取以下类型的参数:

  • URL路径参数
    << 路径参数是从url的Path中匹配的参数,路径参数通常在冒号路由或星号路由中定义,并在url请求的Path中匹配而获取的。
  • URL查询参数
    << URL查询参数,是URL请求中以?为起点的形如k1=v1&k2=v2…这样的字符串解析所得的参数。
  • Form参数
    << Form参数又称作表单参数,这里的表单数据指的是浏览器将表单数据通过POST请求提交给服务器由服务器解析出的数据。
    < 浏览器将发送POST请求时的Content-Type通常为x-www-form-urlencoded或者是multipart/form-data。

在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函数用于参数的获取:

  • GetString(key string, defaultValue …string) ValidString
  • GetBool(key string, defaultValue …bool) ValidBool
  • GetInt(key string, defaultValue …int) ValidInt
  • GetInt32(key string, defaultValue …int32) ValidInt32
  • GetInt64(key string, defaultValue …int64) ValidInt64
  • GetFloat(key string, defaultValue …float64) ValidFloat
  • GetTime(key string, format string, defaultValue …time.Time) ValidTime

GetXXX函数没有直接返回XXX类型的值,例如GetInt返回的不是int类型的值,而是一个ValidInt的类型的值:

type ValidInt struct {
   Value 	int
   Error  	error
}

其中的Value参数的值,Error通常为不存在该参数错误,或者是类型转换错误。例如在使用GetInt(key)来查询一个参数时,若不存在指定的参数,或者时参数不能转换为int类型,则ValidInt的Value的值为0,并且会将错误信息赋值给ValidInt的Error字段。

使用MustXXX便捷函数

MustXXX函数直接返回对应类型的值,使用起来更加便捷。在使用MustXXX函数查询参数时,若不存在指定的参数,或者是类型转换错误,并且在调用时提供了缺省值,则返回缺省值,否则返回对应类型的"0"值:

  • MustString(key string, defaultValue …string) string
  • MustBool(key string, defaultValue …bool) bool
  • MustInt(key string, defaultValue …int) int
  • MustInt32(key string, defaultValue …int32) int32
  • MustInt64(key string, defaultValue …int64) int64
  • MustFloat(key string, defaultValue …float64) float64
  • MustTime(key string, format string, defaultValue …time.Time) time.Time
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)
}

获取Form参数

在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)
}

绑定参数到Struct

除了上面所列的参数获取方式,wego还提供了参数绑定的方式来获取参数:使用GetStruct方法将HTTP请求参数直接绑定到struct对象。GetStruct函数会根据struct的字段名称或者是字段的tag名称来获取请求参数的值。例如:

  • 首先定义struct
type FormUser struct {
	Name 	string 		`form:"name"`
	Age 	int
}
  • 定义好了FormUser后,您可以这样来获取表单参数:
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)
}

解析Json格式的Body到Struct

若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)
}

解析XML格式的Body到Struct

若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框架提供了两个很方便的函数来处理上传文件:

  • GetFile(name string) (*multipart.FileHeader, error)
用于读取表单中的文件信息
  • SaveToFile(fromfile, tofile string) error
用于实现快速保存文件到本地路径

示例代码:

<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))
}

获取wego

go get github.com/haming123/wego

 类似资料: