1 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超6個(gè)贊
您正在做的是綁定要處理的完整路徑。/location/{titan rolex}GetUser
您真正想要的是綁定/location/<every possible string>以由一個(gè)處理程序處理(例如LocationHandler)。
您可以使用標(biāo)準(zhǔn)庫(kù)或其他路由器來(lái)做到這一點(diǎn)。我將介紹兩種方式:
標(biāo)準(zhǔn)庫(kù):
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))
}
但是請(qǐng)注意,/location/<every possible string>/<some int>/<another string>以這種方式實(shí)現(xiàn)更復(fù)雜的路徑(例如)會(huì)很乏味。
另一種方法是使用github.com/julienschmidt/httprouter,特別是如果您更頻繁地遇到這些情況(并且路徑更復(fù)雜)。
以下是您的用例的示例:
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))
}
請(qǐng)注意,httprouter對(duì)處理程序使用稍微不同的簽名。這是因?yàn)?,如您所?jiàn),它還將這些參數(shù)傳遞給函數(shù)。
哦,還有一個(gè)注意事項(xiàng),你可以直接http://localhost:8080/location/titan rolex用你的瀏覽器(或其他東西)點(diǎn)擊 - 如果其他東西足夠好,它會(huì)將 URLEncode 編碼為http://localhost:8080/location/titan%20rolex.
- 1 回答
- 0 關(guān)注
- 269 瀏覽
添加回答
舉報(bào)