Now that we've created a basic web server, let's learn how to handle client-submitted parameters. For simplicity, we'll focus on parameters passed via query strings.
Handling Parameters
Let's modify our "Hello World" example to handle user input:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("/", func(r *ghttp.Request) {
r.Response.Writef(
"Hello %s! Your Age is %d",
r.Get("name", "unknown").String(),
r.Get("age").Int(),
)
})
s.SetPort(8000)
s.Run()
}
The GoFrame framework makes parameter handling straightforward. In this example, we use the r.Get method, which can retrieve parameters from any HTTP method (Query String, Form, Body, etc.). It automatically detects and parses the submission format, including json and xml.
Here's the method signature:
func (r *Request) Get(key string, def ...interface{}) *gvar.Var
The Get method takes two parameters:
- The parameter name to look up
- An optional default value to use if the parameter is missing
It returns a *gvar.Var object - a versatile type provided by GoFrame that can be converted to various data types as needed.
Testing the API
Let's test with parameters at http://127.0.0.1:8000/?name=john&age=18:

And without parameters at http://127.0.0.1:8000/:

Notice how the default values kick in:
- When
nameis missing, it defaults to "unknown" - When
ageis missing, it defaults to 0 (the zero value for integers)
Room for Improvement
While we've successfully handled parameters, there are some issues with this approach:
- Hardcoding parameter names is error-prone - a simple typo could cause bugs that are hard to track down
- There's no clear way to document:
- The business purpose of each parameter
- Expected data types
- Validation rules
- Parameter descriptions
In the next section, we'll solve these problems by introducing structured parameter objects.