Golang中不使用Gorilla库时REST API的PUT调用返回404错误如何解决
Golang中不使用Gorilla库时REST API的PUT调用返回404错误如何解决 我正在编写不使用gorilla库的REST API,当我执行PUT请求时,它返回404。我总是看到使用gorilla的示例。如果不使用gorilla,我该如何解决以下问题。
此外,使用gorilla有什么优势?
mux.HandleFunc("/Employee/{id}", handleEmployee)
func handleEmployee(writer http.ResponseWriter, request *http.Request) {
switch request.Method {
case "GET":
case "POST":
case "PUT":
pathValues := request.URL.Query() //return map
empid := pathValues.Get("id")
println("the emp id is ", empid)
case "DELETE":
default:
println("None of the methods other than above are allowed")
}
}
更多关于Golang中不使用Gorilla库时REST API的PUT调用返回404错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好。我认为你必须给作者写点什么。请试试这个
更多关于Golang中不使用Gorilla库时REST API的PUT调用返回404错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在找到更有说服力的理由不使用依赖项之前,您可以放心使用 gorilla/mux,因为仅使用标准库处理路由相当困难。
你好 George,
感谢你的回复。
我想不使用 gorilla 依赖,而是使用 NewServeMux 来实现。
你好, POST 方法在未向写入器写入任何内容的情况下也能正常工作。 每个示例都使用了 gorilla mux 的 newrouter 方式。我希望使用 golang 包 http 的 newservemux。
通过以下示例了解具体工作原理。
var r = mux.NewRouter()
func getEmployee(writer http.ResponseWriter, request *http.Request) {
// 用于读取gorilla mux路径变量
vars := mux.Vars(r)
id := vars["id"]
// 用于从查询字符串读取参数
query := r.URL.Query()
param1 := query.Get("param1")
...
}
func main() {
...
r.HandleFunc("/employees/{id}", getEmployee).Methods("GET")
r.HandleFunc("/employees", createEmployee).Methods("POST")
...
if err := http.ListenAndServe(":8080", r); err != nil {
log.Fatalln(err)
}
}
一些有用的资源:
在您的代码中,404错误是因为URL路径参数解析方式不正确。您使用的是查询参数(request.URL.Query()),但路径中的{id}应该通过路径解析来获取。以下是修复方案:
问题分析:
- 您的路由模式是
/Employee/{id},但您尝试从查询参数获取id - 标准库
net/http不支持路径参数解析,需要手动处理
解决方案:
package main
import (
"fmt"
"net/http"
"strings"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/Employee/", handleEmployee) // 注意这里使用斜杠结尾
http.ListenAndServe(":8080", mux)
}
func handleEmployee(writer http.ResponseWriter, request *http.Request) {
// 解析路径参数
path := request.URL.Path
segments := strings.Split(path, "/")
// 确保路径格式正确:/Employee/{id}
if len(segments) < 3 || segments[1] != "Employee" {
http.NotFound(writer, request)
return
}
empid := segments[2]
switch request.Method {
case "GET":
fmt.Fprintf(writer, "GET employee with ID: %s", empid)
case "POST":
fmt.Fprintf(writer, "POST employee with ID: %s", empid)
case "PUT":
fmt.Fprintf(writer, "PUT employee with ID: %s", empid)
println("the emp id is ", empid)
case "DELETE":
fmt.Fprintf(writer, "DELETE employee with ID: %s", empid)
default:
http.Error(writer, "Method not allowed", http.StatusMethodNotAllowed)
}
}
更简洁的路径解析版本:
func handleEmployee(writer http.ResponseWriter, request *http.Request) {
// 移除路径前缀并获取ID
id := strings.TrimPrefix(request.URL.Path, "/Employee/")
if id == "" || id == request.URL.Path {
http.NotFound(writer, request)
return
}
switch request.Method {
case "PUT":
fmt.Fprintf(writer, "Updating employee with ID: %s", id)
println("the emp id is ", id)
// 其他方法处理...
}
}
关于Gorilla Mux的优势:
Gorilla Mux提供了更强大的路由功能:
// 使用Gorilla Mux的示例
router := mux.NewRouter()
router.HandleFunc("/Employee/{id}", handleEmployee).Methods("PUT", "GET", "POST", "DELETE")
func handleEmployee(writer http.ResponseWriter, request *http.Request) {
vars := mux.Vars(request)
empid := vars["id"] // 直接获取路径参数
switch request.Method {
case "PUT":
fmt.Fprintf(writer, "Updating employee with ID: %s", empid)
}
}
Gorilla Mux的主要优势:
- 内置路径参数解析(
mux.Vars()) - 支持路由匹配模式(正则表达式、前缀等)
- 支持中间件链
- 自动方法过滤
- 更清晰的路由定义
在标准库中,您需要手动处理路径解析和验证,而Gorilla Mux将这些功能封装成了更易用的API。

