@SSSSTTTTAAAASSSS

Gorilla Mux: не берет значение в vars := mux.Vars(r) Golang?

Добрый день.

Подскажите пожалуйста, пишу Http сервер который поддерживает CRUD API. Столкнулся с проблемой, что на зпрос GetPost - который должен искать по Id поста - не вытягивает Id из строки URL. При чем при проверки в PostMan, если вводить строку вконце /"номер Id", то запрос обрабатывается, а если /{Id}, как прописано в хендлере, то запрос не обрабатывается. Не могу понять в чем причина. Функция вообще не отрабатывает.
Часть кода из хендлера:

type postHandler struct {
Services services.Store
}

func (h *postHandler) NewRouter() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/post", h.CreatePost).Methods("POST")
r.HandleFunc("/post/{Id}", h.GetPost).Methods("GET")
r.HandleFunc("/posts", h.GetAll).Methods("GET")
r.HandleFunc("/post/{Id}", h.DeletePost).Methods("DELETE")
r.HandleFunc("/post/{Id}", h.UpdatePost).Methods("PUT")

return r
}

func (h *postHandler) GetPost(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
key := vars["Id"]
idInt, _ := strconv.Atoi(key)
res, err := h.Services.GetId(idInt)
if err != nil {
w.Write([]byte("could not get post"))
return
}
json.NewEncoder(w).Encode(&res)
}

Соответственно остальные Delete и Update аналогичная проблема.
Буду рад любому совету.
Заранее благодарен.
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Через mux.Vars вы можете извлечь только то, что в URL, т.е. части URL, а параметры нужно извлекать через r.URL.Query().Get("param_name")

Давайте разберём пример из реальной задачи.

В URL содержится английское название категории (chairs), а также параметры фильтров width, height.
https://domain.com/products/chairs?height=200&width=100


Т.е. нужно отобразить все товары из категории "стулья" (chairs), но не выше 200 и не шире 100, соответственно нам нужно получить и chairs из URL и параметры.

Роут будет таким в данном случае
r.HandleFunc("/products/{category_handle}", h.ShowProducts).Methods("GET")


А в обработчике будет уже вот так
// из извлекаем из URL категорию
vars := mux.Vars(r)
categoryHandle := vars["categoryHandle"]

// получаем параметры
height, _ := strconv.Atoi(r.URL.Query().Get("height"))
width, _ := strconv.Atoi(r.URL.Query().Get("width"))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы