我正在创建一个API,并希望按功能分开Endpoints,因为看到net/http
数据包已收到更新,所以我想try 使用它.
/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()
我try 过的:
-
我try 将端点路径从
"GET /"
更改为"GET"
或""
,但显然语法错误 -
我try 将userRouter收件箱路径从
"/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