【问题标题】:golang gorilla/mux and rest GET Problemsgolang gorilla/mux 和 rest GET 问题
【发布时间】:2018-10-05 14:13:15
【问题描述】:

我的删除处理程序:(我正在使用“github.com/gorilla/mux”)

func DeletePerson(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
item := params["id"]
fmt.Println("Item = ", item)
...

当被以下 curl 命令调用时,返回 Item = "2":

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

但是,我的测试代码:

func TestDeletePerson(t *testing.T) {
person := &Person{
    UniqID:    "2",
    FirstName: "",
    LastName:  "",
    EmailAddr: "",
    PhoneNumb: "",
}

jsonPerson, _ := json.Marshal(person)
request, _ := http.NewRequest("DELETE", "/address/2", bytes.NewBuffer(jsonPerson))

response := httptest.NewRecorder()
DeletePerson(response, request)

导致 DeletePerson 返回 "" 和 打印“params”直接返回

map[]

大问题 - 我到底想念什么???

我是否设置了另一个标头参数?

【问题讨论】:

    标签: rest go


    【解决方案1】:

    因为你没有初始化路由器。试试这个

    func TestDeletePerson(t *testing.T) {
        r := mux.NewRouter()
        r.HandleFunc("/adress/{id}", DeletePerson).Methods("DELETE")
        request, _ := http.NewRequest("DELETE", "/adress/2", nil)
    
        response := httptest.NewRecorder()
        r.ServeHTTP(response, request)
    }
    

    另外我认为您不需要发送 Person 对象进行删除

    【讨论】:

    • 路由器在测试程序中初始化。我继续添加
    • 路由器初始化进入 golang 测试函数 - 它没有解决问题。我试图查看一个 gorrilla mux 代码 - 但它不是我理解的语言,所以那里没有帮助。我似乎缺少一些不明显的东西,我必须添加到我不知道的请求中。如果 Cul 能做到,golang 也能做到!!!!
    • 在下面的示例中,您忘记使用 r.ServeHTTP(response, request),因为处理程序对您的外部路由一无所知
    • 问题是您的解决方案没有测试我的删除处理程序“DeletePerson”。 Curl 使用“curl -X DELETE localhost:8000/address/2”行调用“DeletePerson”,它以某种方式允许 mux.Vars 明显找到 map[“id”:“2'”],其中“2”是要删除的记录 id .我似乎无法做的是调用“DeletePerson:”,它会产生所需的地图参数!什么是 gorillia mux.Vars 读取,一些中间标头??
    • mux.Vars 读取 r.URL 并尝试用它找到路由规则。我的代码不起作用,因为我弄错了 url,现在它可以正常工作了
    【解决方案2】:

    问题是您的解决方案没有测试我的删除处理程序“DeletePerson”。 Curl 使用“curl -X DELETE localhost:8000/address/2”行调用“DeletePerson”;并且它以某种方式允许 mux.Vars 明显找到 map["id":"2'"] 其中“2”是要删除的记录 id。我似乎无法做的是调用“DeletePerson:”,它会产生所需的地图参数!什么是大猩猩 mux.Vars 阅读,一些内部标题? – 教父 3 小时前

    【讨论】: