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

6 回复

你好。我认为你必须给作者写点什么。请试试这个

更多关于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。

回到顶部