Невозможно прочитать переменные с URL-адреса с помощью gorilla mux в golang

Я пытаюсь написать модульный тест с использованием gotests и gomock для моей спокойной службы, написанной на golang с использованием gorilla, но служба не может получить переменные из URL-адреса

Вот моя просьба

req, err := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)

фактическая конечная точка - product/{id}

когда я вхожу в свою службу по приведенному ниже коду

params := mux.Vars(req)

Карта params пуста, тогда как ее ключ id должен быть сопоставлен с 5b5758f9931653c36bcaf0a0

Странная часть - конечная точка работает нормально от почтальона.

Могу я узнать, что не так с запросом?

Как выглядит HandleFunce?

Thomas Junk 25.07.2018 17:16

Я бы записал URL-адрес запроса и проанализировал его с помощью url.ParseRequestURI, чтобы получить некоторую информацию.

Aleksej Vasinov 25.07.2018 17:17

зарегистрируйте ошибку, которую вы получаете при создании нового запроса

Himanshu 25.07.2018 17:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
1 876
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы используете запросы GET, вы можете использовать функцию http.Get, она работает должным образом:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
)

func handle(w http.ResponseWriter, r *http.Request) {
    params := mux.Vars(r)
    fmt.Println(params)
}

func main() {
    m := mux.NewRouter()
    m.HandleFunc("/products/{id}", handle)
    http.Handle("/", m)
    go func() {
        http.ListenAndServe(":8080", nil)
    }()
    _, err := http.Get("http://localhost:8080/products/765")
    // Handle Error
}

Если вы действительно хотите использовать http.NewRequest, эта функция на самом деле не выполняет запрос, поэтому вот что вам понадобится:

req, err := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)
client := &http.Client{}
client.Do(req)
Ответ принят как подходящий

Это решило проблему

req = mux.SetURLVars(req, map[string]string{"id": "5b5758f9931653c36bcaf0a0"})

Это не выход.

VadimFilin 09.07.2019 16:14

Создайте мультиплексорный маршрутизатор в отдельной функции в исходном коде и вызовите ее непосредственно в своем тесте.

В исходном коде:

func Router() *mux.Router {
  r := mux.NewRouter()
  r.HandleFunc("/product/{id}", productHandler)

  return r
}

func main() {
http.Handle("/", Router())
}

В тесте:

func TestProductHandler(t *testing.T) {
  r := http.NewRequest("GET", "product/5b5758f9931653c36bcaf0a0", nil)
  w := httptest.NewRecorder()

  Router().ServeHTTP(w, r)
}

Нашел соответствующее решение на одном из форумов групп Google. https://groups.google.com/forum/#!msg/golang-nuts/Xs-Ho1feGyg/xg5amXHsM_oJ

да, это был правильный ответ. Спасибо!

Madeo 18.03.2021 01:53

Другие вопросы по теме