无法使用 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
我正在尝试使用 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