如何使用 Mux 正确处理 Go 的可选查询参数?
How do I handle optional query parameters for a Go using Mux properly?
我正在使用 GoLang 创建一个 API 服务器,我使用 Mux 作为 HTTP 路由器。我的应用程序中有一个端点 /tasks
。当我到达那个端点时,我得到了一系列结果,这是预期的。现在,我想以此为基础,将一个可选的查询参数添加到 URL 中,只得到 return N
结果,像这样: /tasks?num=5
只会 return 5个结果。我使用以下处理程序完成了此操作:
vars := r.URL.Query()
t := task{}
if numOfTasksParam, ok := vars["num"]; ok {
fmt.Printf("%+v", numOfTasksParam[0])
numOfTasks, err := strconv.Atoi(vars.Get("num"))
//return only n number of results
} else {
//return the entire result set
}
我设计这个解决方案是因为我发现 URL.Query()
return 是查询参数的映射,因此,我可以检查该映射是否包含 "num" 的键.如果是这样,客户需要 N
个结果。如果不是,则客户端必须想要整个结果集。
我使用这种方法的主要问题是,当我去检查键是否存在时,我创建了一个名为 numOfTasksParam
的临时变量,它保存查询参数值,但它将值保存为字符串,我需要一个 int
。因此,我必须以某种方式使用 numOfTasksParam
,然后创建另一个变量将其转换为整数值。
是否有更简洁或方便的方法来检查请求中是否存在查询参数URL?
这可能是最简洁的,并且有效,因为 Get
returns 如果未设置参数,则为空字符串,Atoi 将无法解析该字符串:
vars := r.URL.Query()
t := task{}
if numOfTasks, err := strconv.Atoi(vars.Get("num")); err == nil {
//return only numOfTasks number of results
} else {
//return the entire result set
}
你为拥有更少的代码而付出的代价是,如果用户传递了一个无效的值,如 ?num=taco
,它将被视为好像他们没有传递任何东西,而不是告诉用户他们传递了一些不可用的东西。这可能是也可能不是您想要的。它的效率也略低,因为即使已知该值为空,它也会 运行 Atoi
。
我正在使用 GoLang 创建一个 API 服务器,我使用 Mux 作为 HTTP 路由器。我的应用程序中有一个端点 /tasks
。当我到达那个端点时,我得到了一系列结果,这是预期的。现在,我想以此为基础,将一个可选的查询参数添加到 URL 中,只得到 return N
结果,像这样: /tasks?num=5
只会 return 5个结果。我使用以下处理程序完成了此操作:
vars := r.URL.Query()
t := task{}
if numOfTasksParam, ok := vars["num"]; ok {
fmt.Printf("%+v", numOfTasksParam[0])
numOfTasks, err := strconv.Atoi(vars.Get("num"))
//return only n number of results
} else {
//return the entire result set
}
我设计这个解决方案是因为我发现 URL.Query()
return 是查询参数的映射,因此,我可以检查该映射是否包含 "num" 的键.如果是这样,客户需要 N
个结果。如果不是,则客户端必须想要整个结果集。
我使用这种方法的主要问题是,当我去检查键是否存在时,我创建了一个名为 numOfTasksParam
的临时变量,它保存查询参数值,但它将值保存为字符串,我需要一个 int
。因此,我必须以某种方式使用 numOfTasksParam
,然后创建另一个变量将其转换为整数值。
是否有更简洁或方便的方法来检查请求中是否存在查询参数URL?
这可能是最简洁的,并且有效,因为 Get
returns 如果未设置参数,则为空字符串,Atoi 将无法解析该字符串:
vars := r.URL.Query()
t := task{}
if numOfTasks, err := strconv.Atoi(vars.Get("num")); err == nil {
//return only numOfTasks number of results
} else {
//return the entire result set
}
你为拥有更少的代码而付出的代价是,如果用户传递了一个无效的值,如 ?num=taco
,它将被视为好像他们没有传递任何东西,而不是告诉用户他们传递了一些不可用的东西。这可能是也可能不是您想要的。它的效率也略低,因为即使已知该值为空,它也会 运行 Atoi
。