为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-10-11 10:52:30
在这个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
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

HandleFunc不知道该怎么办{id}。给它一个它可以匹配的特定路径:

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


查看完整回答
反对 回复 2021-10-11
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

内置的 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


查看完整回答
反对 回复 2021-10-11
  • 3 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信