为何HTTP服务器中可获取PathValue,测试环境却无法解析?
问题原因及解决方案
核心问题
你在测试中通过mux.Handler(req)提取handler后单独调用ServeHTTP,但**http.ServeMux的路径参数解析逻辑只在它自身的ServeHTTP方法内部完成**,单独调用提取出的handler时,请求对象不会被填充路径参数,因此PathValue("id")返回空字符串。
修正后的测试代码
不要手动提取handler,直接调用mux.ServeHTTP让路由完整处理请求(包含路径匹配与参数填充):
rr := httptest.NewRecorder() req, err := http.NewRequest(http.MethodGet, "/customers/10006.json", nil) assert.NoError(t, err) // 直接使用mux的ServeHTTP方法,而非单独调用提取出的handler mux.ServeHTTP(rr, req) assert.Equal(t, 400, rr.Result().StatusCode) var msg string json.NewDecoder(rr.Body).Decode(&msg) assert.Equal(t, "unable to parse customer id - 10006.json", msg)
原理说明
真实服务器运行时,请求全程由ServeMux.ServeHTTP处理:
- 匹配请求路径到对应的路由规则
- 解析路径参数并将其存入请求上下文
- 再调用对应的业务handler
而mux.Handler(req)仅返回匹配到的handler实例,不会执行参数解析和上下文填充步骤,因此你的业务handler拿到的请求没有路径参数信息,导致PathValue("id")为空。
内容的提问来源于stack exchange,提问作者user2453676
相关产品推荐
相关产品推荐

