【问题标题】:Gorilla Mux - not routing as expectedGorilla Mux - 未按预期路由
【发布时间】:2022-01-11 11:36:14
【问题描述】:

我们将不胜感激,显然我遗漏了一些非常简单的东西。

我已经创建了一个简单的测试平台,用于将对不同方法的调用路由到不同的处理程序。

相反,简单的 get 处理程序正在获取所有 get 请求,并且无法识别 delete 和 put!

所以 localhost:8080/users 和

localhost:8080/users?id=1

得到。路由到 getUsers 路由。这个问题的答案一定是微不足道的,但我看不到它,因此您的帮助将不胜感激。

下面是测试台的完整列表

package main

import (
    "encoding/json"
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
)

type User struct {
    Id   string `json:"id"`
    Name string `json:"name"`
}

type Users []User

var users = Users{
    User{
        Id:   "1",
        Name: "Tula",
    },
    User{
        Id:   "2",
        Name: "Monty",
    },
    User{
        "3",
        "Merry",
    },
    User{
        Id:   "4",
        Name: "Paddy",
    },
    User{
        Id:   "5",
        Name: "Hendrix",
    },
    User{
        Id:   "6",
        Name: "Purdy",
    },
    User{
        Id:   "7",
        Name: "turnip",
    },
}

func main() {
    r := mux.NewRouter()

    r.Path("/users/{id:[0-9]+}").
        Queries("id", "{id:[0-9]*?}").
        Methods(http.MethodGet).
        HandlerFunc(getUser).
        Name("getUser")

    r.Path("/users").
        Methods(http.MethodGet).
        HandlerFunc(getUsers).
        Name("getUsers")

    r.Path("/users").
        Methods(http.MethodPost).
        HandlerFunc(CreateUser).
        Name("CreateUser")

    r.Path("/users/{id:[0-9]+}").
        Queries("id", "{id:[0-9]*?}").
        Methods(http.MethodPut).
        HandlerFunc(updateUser).
        Name("updateUser")

    r.Path("/users/{id:[0-9]+}").
        Queries("id", "{id:[0-9]*?}").
        Methods(http.MethodDelete).
        HandlerFunc(deleteUser).
        Name("deleteUser")

    log.Fatal(http.ListenAndServe(":8080", r))
}

func getUsers(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)

    err := json.NewEncoder(w).Encode(users)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
    } else {
        _, _ = fmt.Fprintf(w, "GetUsers!")
    }
}

func getUser(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    _, _ = fmt.Fprintf(w, "GetUser!")
}

func CreateUser(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    _, _ = fmt.Fprintf(w, "CreateUser!")

    var newUser User
    err := json.NewDecoder(r.Body).Decode(&newUser)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
    } else {
        users = append(users, newUser)
        _ = json.NewEncoder(w).Encode(users)
    }
}
func updateUser(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    _, _ = fmt.Fprintf(w, "Update!")
}
func deleteUser(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    w.WriteHeader(http.StatusOK)
    _, _ = fmt.Fprintf(w, "Delete!")
}

【问题讨论】:

    标签: go routes


    【解决方案1】:

    当您获取 url localhost:8080/users?id=1 时,路径是 /users。映射到GET /users 的唯一路径是:

        r.Path("/users").
            Methods(http.MethodGet).
            HandlerFunc(getUsers).
            Name("getUsers")
    

    这就是请求映射到getUsers 方法的原因。 getUser 的配置实际上没有任何意义。你有:

        r.Path("/users/{id:[0-9]+}").
            Queries("id", "{id:[0-9]*?}").
            Methods(http.MethodGet).
            HandlerFunc(getUser).
            Name("getUser")
    

    这需要像http://localhost:8080/users/1?id=1 这样的请求(然后它会忽略路径中的 id)。我会将配置修改为如下所示:

        r.Path("/users/{id:[0-9]+}").
            Methods(http.MethodGet).
            HandlerFunc(getUser).
            Name("getUser")
    

    然后您的请求将类似于 http://localhost:8080/users/1http://localhost:8080/users/2 等。

    【讨论】:

      【解决方案2】:

      简单到底

      r.Path("/users/{id:[0-9]+}").
                  Queries("id", "{id:[0-9]*?}").
                  Methods(http.MethodGet).
                  HandlerFunc(getUser).
                  Name("updateUser")
      

      成为

      r.Path("/users").
                  Queries("id", "{id:[0-9]*?}").
                  Methods(http.MethodGet).
                  HandlerFunc(GetUser).
                  Name("updateUser")
      

      【讨论】:

        猜你喜欢
        • 2015-04-18
        • 2014-09-08
        • 2016-04-07
        • 2016-04-26
        • 2015-04-05
        • 2014-12-16
        • 2021-06-05
        • 2017-11-07
        • 1970-01-01
        相关资源
        最近更新 更多