无法使用 golang 中的 gorilla mux 从 url 读取变量

Unable to read variables from a url using gorilla mux in golang

我正在尝试使用 gotests 和 gomock 为我的 restful 服务编写一个单元测试,该服务使用大猩猩在 golang 中编写,但服务无法从 url

获取变量

这是我的要求

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

实际终点是product/{id}

当我通过以下代码进入我的服务时

params := mux.Vars(req)

params 映射是空的,而它应该将 id 键映射到 5b5758f9931653c36bcaf0a0

奇怪的是端点在 post man.

中工作正常

请问请求有什么问题吗?

由于您使用的是 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"})

在源代码中的单独函数中创建 mux 路由器,并在您的测试中直接调用它。

在源代码中:

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