如何正确使用Mux处理Go的可选查询参数?

时间:2020-03-25 01:04:05

标签: http go mux

我正在使用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中是否存在查询参数是否更简洁明了?

1 个答案:

答案 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

相关问题