Golang 1.22+ API为何无法处理空通配符?访问/api/text/get/返回404
问题原因
Go 1.22+ 里的http.ServeMux对路径参数{id}的匹配规则是必须对应非空的路径段。你定义的/api/text/get/{id}路由,只能匹配/api/text/get/xxx这类在/get/后有实际内容的请求。当访问/api/text/get/时,/get/后面没有任何路径段,请求根本不会命中这个路由,直接触发404,自然不会执行你处理函数里的空值判断逻辑。
解决方法
如果要处理不带ID的请求,需要单独添加一个匹配/api/text/get/的路由:
package api import ( "fmt" "net/http" ) func StartServer() error { mux := http.NewServeMux() // 处理无ID的请求 mux.HandleFunc("/api/text/get/", func(w http.ResponseWriter, r *http.Request) { http.Error(w, "Text-ID is missing!", http.StatusBadRequest) return }) // 处理带ID的请求 mux.HandleFunc("/api/text/get/{id}", func(w http.ResponseWriter, r *http.Request) { id := r.PathValue("id") fmt.Printf("%v\n", id) fmt.Printf("Searching for text with ID %s\n", id) }) fmt.Println("Starting server on port 8080...") return http.ListenAndServe(":8080", mux) }
补充说明:PathValue文档中提到的"缺失值返回空字符串",是指路由匹配成功但参数对应的路径段为空的场景,但{id}这种普通参数要求必须匹配非空内容,只有使用{id...}这种后缀通配符时,才可能匹配空路径段(不过这种通配符会匹配后续所有路径内容,适合需要捕获多级路径的场景)。
内容的提问来源于stack exchange,提问作者Thomas J.
相关产品推荐
相关产品推荐

