【问题标题】:Building a Rest Request with Dynamic Segments使用动态分段构建休息请求
【发布时间】:2018-10-05 15:04:22
【问题描述】:

我正在尝试测试一个处理程序,该处理程序如下:

router.HandleFunc("/address/{id}", DeletePerson).Methods("DELETE")

我创建的请求是:

request, _ := http.NewRequest("DELETE", "/address/2", nil)
DeletePerson(response, request)

使用 github.com/gorilla/mux 我试图提取“id”

params = mux.Vars(request)
item := params["id"]

returns:  params = map[] and item = ""

但是,如果我使用 curl 命令调用 DeletePerson:

curl -X DELETE http://localhost:8000/address/2

我得到:params = map["id"] and item = "2"

如何构造一个 URL 请求来获得像 Curl 这样的结果?

【问题讨论】:

  • 请发布响应头状态。查看您的请求是否正确完成或是否引发了一些 HTTP 错误。所以在测试用例中创建请求时不要跳过错误。
  • 打印此代码中的错误 sn -p request, err := http.NewRequest("DELETE", "/address/2", nil)

标签: rest go


【解决方案1】:

我认为问题在于您没有将完整的 URL 放入请求中。而且我猜您在执行请求时忽略了错误。如果你没有输入完整的 URL,它会抱怨这样的事情:panic: Delete /address/2: unsupported protocol scheme ""

以下代码在我的机器上运行正常:

package main

import "net/http"

func main() {
    r, err := http.NewRequest("DELETE", "http://localhost:8080/address/2", nil)
    if err != nil {
        panic(err)
    }
    if _, err := http.DefaultClient.Do(r); err != nil {
        panic(err)
    }
}

希望这会有所帮助:)

【讨论】:

    【解决方案2】:

    如果直接调用DeletePerson,请求不会经过路由器,路由器会解析请求路径中的参数。

    另外,http.NewRequest 返回一个客户端请求。要么将方案和主机添加到 URL 并将请求传递给 http.Client.Do,要么使用 httptest.NewRequest 直接创建服务器请求。

    NewRequest 返回一个新的传入服务器请求,适合传递给 http.Handler 进行测试。

    request := httptest.NewRequest("DELETE", "/address/2", nil)
    mux.ServeHTTP(response, request)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多