Невозможно прочитать переменные из URL, используя Gorilla Mux в Голанге

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

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

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

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

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

params := mux.Vars(req)

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

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

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

2 ответа

Решение

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

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

Поскольку вы используете 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)

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

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

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/

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