我正在使用GoLang制造API服务器,并且正在使用Mux作为HTTP路由器。我的应用程序中有一个端点/tasks
。当我达到那个端点时,我得到了预期的一系列结果。现在,我希望以此为基础,并在URL中添加一个可选的查询参数,以仅返回N
个结果,例如:/tasks?num=5
仅返回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()
返回了查询参数的映射,因此,我可以检查该映射是否包含键“ num”。如果是这样,则客户需要N
个结果数。如果不是,则客户必须要整个结果集。
此方法的主要问题是,当我去检查键是否存在时,我创建了一个名为numOfTasksParam
的临时变量,该临时变量保存查询参数值,但它将值保存为字符串,并且我需要一个int
。因此,我必须以某种方式使用numOfTasksParam
,然后创建另一个变量以将其转换为整数值。
检查请求URL中是否存在查询参数是否更简洁明了?
答案 0 :(得分:1)
这可能是最简洁的方法,之所以有效,是因为如果未设置参数,Get
将返回一个空字符串,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
。