转到 1.22 net/http 组路由

问题描述 投票:0回答:1

我正在创建一个 API,并希望按功能分离端点,因为看到

net/http
数据包已收到更新,所以我想尝试使用它。

/v1/user
端点给我带来了问题,并且没有返回预期的数据,以下是一些可能有帮助的
curl

$ curl -X 'GET' 'http://localhost:5000/v1/user/john'      
GET /v1/user/{username}

$ curl -X 'GET' 'http://localhost:5000/v1/user/'
GET /v1/user

$ curl -X 'GET' 'http://localhost:5000/v1/user'
<a href="/user/">Moved Permanently</a>.

这是我当前的代码(我删除了多余的端点):

// will be moved of the user.go file
userRouter := http.NewServeMux()
userRouter.HandleFunc("GET /", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("GET /v1/user"))
})
userRouter.HandleFunc("GET /{username}", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("GET /v1/user/{username}"))
})

// will remain inside api.go
v1 := http.NewServeMux()
v1.Handle("/user/", http.StripPrefix("/user", userRouter))

main := http.NewServeMux()
main.Handle("/v1/", http.StripPrefix("/v1", v1))

server := &http.Server{ Addr: "localhost:5000", Handler: main }
server.ListenAndServe()

我尝试过的:

  • 我尝试将端点路径从

    "GET /"
    更改为
    "GET"
    ""
    ,但显然语法是错误的

  • 我尝试将 userRouter Handler 路径从

    "/user/"
    更改为
    "/user"
    ,这样做会导致所有端点停止工作

$ curl -X 'GET' 'http://localhost:5000/v1/user/john'
404 page not found

$ curl -X 'GET' 'http://localhost:5000/v1/user/'    
404 page not found

$ curl -X 'GET' 'http://localhost:5000/v1/user'
<a href="/">Moved Permanently</a>.
  • 仍然保留之前的更改,但删除了
    http.StripPrefix
    userRounter
    路由器,并将
    /user
    添加到端点;唯一的工作端点是
    /v1/user
    。代码:
userRouter := http.NewServeMux()
userRouter.HandleFunc("GET /user", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("GET /v1/user"))
})
userRouter.HandleFunc("GET /user/{username}", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("GET /v1/user/{username}"))
})

v1 := http.NewServeMux()
v1.Handle("/user", userRouter)

main := http.NewServeMux()
main.Handle("/v1/", http.StripPrefix("/v1", v1))

server := &http.Server{ Addr: "localhost:5000", Handler: main }
server.ListenAndServe()

要求:

$ curl -X 'GET' 'http://localhost:5000/v1/user/john'
404 page not found

$ curl -X 'GET' 'http://localhost:5000/v1/user/'    
404 page not found

$ curl -X 'GET' 'http://localhost:5000/v1/user'     
GET /v1/user
go http routes handler
1个回答
0
投票

这里的问题是

v1.Handle("/user", userRouter)
你忘了添加
/

package main

import (
    "net/http"
)

func main() {
    userRouter := http.NewServeMux()
    userRouter.HandleFunc("GET /user", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("GET /v1/user"))
    })
    userRouter.HandleFunc("GET /user/{username}", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("GET /v1/user/{username}"))
    })

    v1 := http.NewServeMux()
    v1.Handle("/user/", userRouter)

    main := http.NewServeMux()
    main.Handle("/v1/", http.StripPrefix("/v1", v1))

    server := &http.Server{Addr: "localhost:5000", Handler: main}
    server.ListenAndServe()
}
© www.soinside.com 2019 - 2024. All rights reserved.