【问题标题】:Unable to read variables from a url using gorilla mux in golang无法在 golang 中使用 gorilla mux 从 url 读取变量
【发布时间】:2019-01-02 10:45:35
【问题描述】:

我正在尝试使用 gotests 和 gomock 为我使用 gorilla 用 golang 编写的宁静服务编写单元测试,但服务无法从 url 获取变量

这是我的要求

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

实际端点是product/{id}

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

params := mux.Vars(req)

params 映射为空,而 id 键映射到 5b5758f9931653c36bcaf0a0

奇怪的是端点在邮递员那里工作得很好。

我可以知道请求有什么问题吗?

【问题讨论】:

  • HandleFunce 长什么样子?
  • 我会记录请求 URL 并用 url.ParseRequestURI 解析它以获取一些信息。
  • 记录您在创建新请求时遇到的错误

标签: rest unit-testing go gorilla mux


【解决方案1】:

这解决了问题

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

【讨论】:

  • 这不是解决方案。
  • 这是 imo 最简单的解决方案。只需在您的测试中执行此操作,瞧!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    在源代码中:

    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

    【讨论】:

    • 是的,这是正确的答案。谢谢!
    猜你喜欢
    • 2014-11-28
    • 2017-03-10
    • 2014-02-09
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2018-02-13
    • 2018-07-30
    • 2016-05-06
    相关资源
    最近更新 更多