Golang中如何在函数内获取URL路径参数id的值?
解决方法
注意:你用的是标准库http.ServeMux,不支持/{id}参数化路由
标准库的ServeMux只支持简单的前缀/后缀匹配,像/{id}这种动态参数语法是第三方路由库(比如gorilla/mux)的特性,所以原代码的路由规则不会生效。
方案1:使用gorilla/mux(推荐)
先安装依赖库:
go get github.com/gorilla/mux
修改后的完整代码:
import ( "log" "net/http" "github.com/gorilla/mux" ) func InitRouter() { r := mux.NewRouter() // {id}会匹配任意非斜杠的路径段 r.HandleFunc("/{id}", getWords) log.Fatal(http.ListenAndServe(":8000", r)) } func getWords(w http.ResponseWriter, r *http.Request) { // 从请求中提取路由参数 vars := mux.Vars(r) id := vars["id"] // 输出id到响应,也可以打印到日志 w.Write([]byte(id)) log.Println(id) }
这样访问localhost:8000/cat时,getWords会输出cat;访问localhost:8000/3时输出3。
方案2:坚持使用标准库http.ServeMux
如果不想引入第三方库,可以手动解析路径:
import ( "log" "net/http" "strings" ) func InitRouter() { r := http.NewServeMux() // 匹配所有根路径下的请求(包含子路径) r.HandleFunc("/", getWords) log.Fatal(http.ListenAndServe(":8000", r)) } func getWords(w http.ResponseWriter, r *http.Request) { // 去掉路径前缀"/",得到id部分 id := strings.TrimPrefix(r.URL.Path, "/") // 处理直接访问根路径的情况 if id == "" { w.Write([]byte("请输入有效的ID")) return } w.Write([]byte(id)) log.Println(id) }
这个方法会匹配所有以/开头的请求,需要额外处理根路径访问的场景。
内容的提问来源于stack exchange,提问作者Haroune
相关产品推荐
相关产品推荐

