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

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


func productHandler(w http.ResponseWriter, r *http.Request){

    key := r.URL.Path[len("/products/":]

    switch r.Method{

    case "GET":

      //do stuff

    case "POST"

      //do stuff

    default:

       http.Error(w, "method not allowed", 405)

    }

}

尽管他的实际路线是什么样的,但从他的介绍中并不清楚。


我正在尝试构建一个处理带有 id 的放置请求的路由。当我单击页面上的元素时,它会向此路由发送放置请求


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 未找到,并且没有迹象表明我的函数被调用(即它没有记录)


问题:如何创建处理 PUT 请求的自定义路由/函数


http://localhost:8080/products/1433255183951


交互式爱情
浏览 167回答 3
3回答

白猪掌柜的

HandleFunc不知道该怎么办{id}。给它一个它可以匹配的特定路径:http.HandleFunc("/products/", doSomethingWithProduct)

慕运维8079593

内置的 HTTP 路由器并没有做任何像绑定参数那样花哨的事情;但是,您可以指定与处理程序关联的整个前缀。请参阅 的文档http.ServeMux。尝试这样的事情: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 -XPUT http://localhost:8080/products/1234# => OK: PUT /products/1234 productId=1234
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go