我想执行get操作。我是名称作为URL的资源。
我在Postman中遇到的URL是:localhost:8080/location/{titan rolex}
(我在下拉列表中选择了GET方法)
在Postman中点击的URL中,我正在执行GetUser func(),其主体为:
func GetUser(rw http.ResponseWriter, req *http.Request) {
}
现在我想在GetUser方法中获取资源值,即'titan rolex'。 我怎样才能在golang中实现这个目标?
在main()中,我有这个:
http.HandleFunc("/location/{titan rolex}", GetUser)
提前致谢。
答案 0 :(得分:0)
您正在做的是绑定要由/location/{titan rolex}
处理的完整路径GetUser
。
您真正想要的是绑定/location/<every possible string>
以由一个处理程序处理(例如LocationHandler
)。
您可以使用标准库或其他路由器执行此操作。我将介绍两种方式:
标准馆:
import (
"fmt"
"net/http"
"log"
)
func locationHandler(w http.ResponseWriter, r *http.Request) {
name := r.URL.Path[len("/location/"):]
fmt.Fprintf(w, "Location: %s\n", name)
}
func main() {
http.HandleFunc("/location/", locationHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
但是请注意,更复杂的路径(例如/location/<every possible string>/<some int>/<another string>
)将以这种方式实施起来很繁琐。
另一种方法是使用github.com/julienschmidt/httprouter,特别是如果您经常遇到这些情况(并且路径更复杂)。
以下是您的用例示例:
import (
"fmt"
"github.com/julienschmidt/httprouter"
"net/http"
"log"
)
func LocationHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
fmt.Fprintf(w, "Location: %s\n", ps.ByName("loc"))
}
func main() {
router := httprouter.New()
router.GET("/location/:loc", LocationHandler)
log.Fatal(http.ListenAndServe(":8080", router))
}
请注意,httprouter
对处理程序使用稍微不同的签名。这是因为,正如您所看到的,它也将这些参数传递给函数。
哦,还有另一个注意事项,你可以用你的浏览器(或其他东西)点击http://localhost:8080/location/titan rolex
- 如果其他东西足够好,它会将URLEncode设为http://localhost:8080/location/titan%20rolex
。