Невозможно прочитать переменные из 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/