在前面章节中,我们学会了如何开发一个简单的Web Server程序。 在本章节中,我们将会尝试着在Web Server中获取客户端提交的参数信息。 为简化示例,我们使用Query String的方式来传递请求参数。

参数示例

我们将之前的Hello World示例程序进行简单的改造:

main.go

  1. package main
  2. import (
  3. "github.com/gogf/gf/v2/frame/g"
  4. "github.com/gogf/gf/v2/net/ghttp"
  5. )
  6. func main() {
  7. s := g.Server()
  8. s.BindHandler("/", func(r *ghttp.Request) {
  9. r.Response.Writef(
  10. "Hello %s! Your Age is %d",
  11. r.Get("name", "unknown").String(),
  12. r.Get("age").Int(),
  13. )
  14. })
  15. s.SetPort(8000)
  16. s.Run()
  17. }

GoFrame框架中,获取参数非常便捷。在本示例中,我们通过r.Get方法获取客户端提交的参数,该方法能够获取所有HTTP Method提交的参数, 比如Query String/Form/Body等,其内部将会根据客户端提交的类型自动识别解析,比如支持自动识别参数格式例如json/xml等。该方法的定义如下:

  1. func (r *Request) Get(key string, def ...interface{}) *gvar.Var

可以看到,Get方法接受两个参数,第一个为参数名称,第二个参数为非必须参数,表示默认值。返回结果为一个*gvar.Var对象,该对象为GoFrame框架 提供的运行时泛型对象,开发者可以根据业务场景需要将参数转换为各种类型。

执行结果

运行后,我们访问 http://127.0.0.1:8000/?name=john&age=18 可以看到,页面输出结果符合预期。

img.png

我们访问 http://127.0.0.1:8000/ 可以看到,页面输出结果同样符合预期。当未传递name参数时,程序将会使用默认值unknown,并且age参数会使用int类型的默认值0

alt text

学习小结

在本章节中,我们学会了如何在HTTP回调函数中获取客户端提交的参数。

但大家可以看到,在本示例的代码中,存在一些显而易见的问题:

  • 参数的接收使用了硬编码的参数名称, 如果在真实的项目开发中,很容易由于参数拼写错误引发异常。
  • 硬编码的参数名称不能确定业务含义和数据类型,很难进行长期管理维护, 例如难以对参数进行描述说明、类型校验等基本操作。

在下一章节中,我们尝试通过结构化的参数对象来规避这一问题。