Go 在没有第三方路由库的情况下路由PUT请求

Go 在没有第三方路由库的情况下路由PUT请求,go,Go,在Blake Mizerany的Golang演讲的Youtube视频(15:29左右)中,他讲述了如何在不使用第三方软件包的情况下构建路由器,详细介绍了如何构建具有可变组件(如id)的路由。这是他使用的处理程序,第一行显示了如何获取路由的可变组件(即钥匙) 从他的介绍中还不清楚他的实际路线是什么样的 我正在尝试构建一个路由来处理id为的put请求。当我单击页面上的某个元素时,它会将put请求发送到此路由 http://localhost:8080/products/1433255183951

在Blake Mizerany的Golang演讲的Youtube视频(15:29左右)中,他讲述了如何在不使用第三方软件包的情况下构建路由器,详细介绍了如何构建具有可变组件(如id)的路由。这是他使用的处理程序,第一行显示了如何获取路由的可变组件(即钥匙)

从他的介绍中还不清楚他的实际路线是什么样的

我正在尝试构建一个路由来处理id为的put请求。当我单击页面上的某个元素时,它会将put请求发送到此路由

http://localhost:8080/products/1433255183951
我有一条这样的路线

   http.HandleFunc("/products/{id}", doSomethingWithProduct){

   }
当然,我们有这个功能

func doSomethingWithProduct(res http.ResponseWriter, req *http.Request{
     key := req.URL.Path[len("/products/"):]

     log.Println(key, "is this logging?? nope")

}
问题。即使我设置了路由和处理程序,当我单击元素时,我得到了一个404未找到,并且没有迹象表明调用了我的函数(即,它没有记录)

问题:如何创建一个自定义路由/func来处理PUT请求

http://localhost:8080/products/1433255183951

HandleFunc
不知道如何处理
{id}
。请为它指定一个可以匹配的特定路径:

http.HandleFunc("/products/", doSomethingWithProduct)

http.HandleFunc
不会像处理
{id}
那样处理“捕获组”

http.HandleFunc(“/products/”,handler)
将匹配以此模式开头的所有路由。您必须自己解析其余部分

ServeMux是一个HTTP请求多路复用器。它将每个传入请求的URL与注册模式列表相匹配,并为与URL最匹配的模式调用处理程序

模式名称固定的根路径,如“/favicon.ico”,或根子树,如“/images/”(注意尾随的斜杠)。较长的模式优先于较短的模式,因此,如果有为“/images/”和“/images/thumbnails/”注册的处理程序,则将为以“/images/thumbnails/”开头的路径调用后一个处理程序前者将接收对“/images/”子树中任何其他路径的请求

请注意,由于以斜杠结尾的模式将根子树命名,因此模式“/”将匹配其他已注册模式未匹配的所有路径,而不仅仅是路径为=“/”的URL

模式可以选择以主机名开头,仅将匹配限制为该主机上的URL。特定于主机的模式优先于常规模式,以便处理程序可以注册两种模式“/codesearch”和“codesearch.google.com/”,而不必同时接管对“”的请求

ServeMux还负责清理URL请求路径,将包含.or..元素的任何请求重定向到等效的。-和..-自由URL


内置HTTP路由器不做绑定参数之类的事情;但是,您可以指定与处理程序关联的整个前缀。有关详细信息,请参阅文档

试着这样做:

func main() {
  productsPrefix := "/products/"
  http.HandleFunc(productsPrefix, func(w http.ResponseWriter, r *http.Request) {
    if (r.Method == "PUT") && (strings.Index(r.URL.Path, productsPrefix) == 0) {
      productId := r.URL.Path[len(productsPrefix):]
      fmt.Printf("OK: %s %s productId=%s\n", r.Method, r.URL.Path, productId)
    }
  })

  log.Print("Listening on localhost:8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}
例如:

$curl-XPUThttp://localhost:8080/products/1234
#=>确定:PUT/products/1234 productId=1234

你们都回答“5分钟前”。我不知道该接受谁的答案,所以我会掷硬币。然而,我投票支持你们两人。根据这样的说法,你们和吉米都回答“5分钟前”。我不知道该接受谁的答案,所以我会掷硬币。然而,我投票支持你们两人。
func main() {
  productsPrefix := "/products/"
  http.HandleFunc(productsPrefix, func(w http.ResponseWriter, r *http.Request) {
    if (r.Method == "PUT") && (strings.Index(r.URL.Path, productsPrefix) == 0) {
      productId := r.URL.Path[len(productsPrefix):]
      fmt.Printf("OK: %s %s productId=%s\n", r.Method, r.URL.Path, productId)
    }
  })

  log.Print("Listening on localhost:8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}