Как правильно обрабатывать необязательные параметры запроса для Go, используя Mux? - PullRequest
0 голосов
/ 25 марта 2020

Я делаю сервер API, используя GoLang, и я использую 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 количество результатов. Если нет, клиенту нужен полный набор результатов.

Основная проблема, с которой я столкнулся при таком подходе, заключается в том, что когда я go проверяю, существуют ли ключи, я делаю временную переменную с именем numOfTasksParam, которая содержит значение параметра запроса, но оно содержит значение в виде строки, и мне нужно int. Поэтому я должен каким-то образом использовать numOfTasksParam, а затем создать другую переменную для преобразования ее в целочисленное значение.

Существует ли более краткий или удобный способ проверки, существует ли параметр запроса в URL-адресе запроса?

1 Ответ

1 голос
/ 25 марта 2020

Это, вероятно, самый краткий и работает, потому что 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, даже если известно, что значение пустое.

...