我正在创建一个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

推荐答案

这里的问题是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)
    v1.Handle("/user", userRouter)
    main := http.NewServeMux()
    main.Handle("/v1/", http.StripPrefix("/v1", v1))

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

我建议您可以这样编写简单的路由代码

package main

import (
    "net/http"
)

func main() {

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

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


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

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

如何在jsonrpc服务器的服务器端捕获错误?

GoLang:无法发送带有附件的邮箱

Golang使用Run()执行的命令没有返回

Hugo错误:没有为此项目配置现有内容目录

GORM:一个表的两个外键

如何在golang中使用viper获取对象的配置数组?

Go - 永远停止带有上下文的循环

如何解决构建Docker Compose时的权限被拒绝问题

在 Go 中解组编号的 XML 标签

git ls-remote 成功而 go get 失败

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

设置指向空接口的指针

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

GOLANG:为什么 SetDeadline/SetReadDeadline/SetWriteDeadline 在使用 os.File.Fd() 时对文件不起作用?

如何在gin中获取参数值数组

如何 Select 前 N 个元素 Gin-Gorm

Golang:每个键具有多个值的映射

使用 xml.Name 将 xml 解组为 [] struct

如何发送带有登录数据的 GET 请求并将 cookie 数据保存到 txt 文件?