使用 url 参数和 mysql 数据库无法正常工作的 chi router
go chi router with url parameters and mysql db not working properly
我是 golang 的新手,正在使用 chi 在 golang 中开发 restful 服务。我正在尝试创建如下路线:
func NewRouter(dm *storage.DatabaseManager) chi.Router {
var router = chi.NewRouter()
router.Method("POST", "/restaurant/search?name={name}",
&SearchRestaurants{DB: dm})
}
下面是我如何从 mysql db:
获取
func (rm *RestaurantManager) SearchRestaurantsFromDB(name string)
([]Restaurant, error) {
var restaurants []Restaurant
var stmt = fmt.Sprintf(`SELECT * FROM %s WHERE name=%s `,
rm.tableName, name)
var err error
if err = rm.Select(&restaurants, stmt); err != nil {
return nil, err
}
return restaurants, nil
}
...以及我如何从中得到:
func (h SearchRestaurants) ServeHTTP(w http.ResponseWriter, r
*http.Request) {
var err error
var result []storage.Restaurant
name := r.URL.Query().Get("name")
if result, err = h.DB.SearchRestaurantsFromDB(name); err != nil {
log.Fatal("Database Error: ", err)
}
fmt.Print(result)
api.WriteJSON(w, result)
log.Print(r.RequestURI)
}
但我尝试到达此端点,但我收到 404 not found:
http://localhost:8000/project/restaurant/search?name={n}
我可以知道这里的问题吗?
P.S.there 在主函数中是 router.Mount("/project/", restaurant.NewRouter(dm))
。
我不知道 chi
但我认为你误解了路由器路径
你实际上不使用查询参数来定义路径路由器,路径上的变量如 {n}
是用于路径参数的。您使用的是查询参数。
看这里的区别:
路径参数
访问来自:http://localhost:3333/name/JohnDoe
func main() {
r := chi.NewRouter()
r.Get("/name/{name}", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hi" + chi.URLParam(r, "name")))
})
http.ListenAndServe(":3333", r)
}
查询参数
访问来自:http://localhost:3333/name?name=JohnDoe
func main() {
r := chi.NewRouter()
r.Get("/name", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hi" + r.URL.Query().Get("name")))
})
http.ListenAndServe(":3333", r)
}
我是 golang 的新手,正在使用 chi 在 golang 中开发 restful 服务。我正在尝试创建如下路线:
func NewRouter(dm *storage.DatabaseManager) chi.Router {
var router = chi.NewRouter()
router.Method("POST", "/restaurant/search?name={name}",
&SearchRestaurants{DB: dm})
}
下面是我如何从 mysql db:
获取 func (rm *RestaurantManager) SearchRestaurantsFromDB(name string)
([]Restaurant, error) {
var restaurants []Restaurant
var stmt = fmt.Sprintf(`SELECT * FROM %s WHERE name=%s `,
rm.tableName, name)
var err error
if err = rm.Select(&restaurants, stmt); err != nil {
return nil, err
}
return restaurants, nil
}
...以及我如何从中得到:
func (h SearchRestaurants) ServeHTTP(w http.ResponseWriter, r
*http.Request) {
var err error
var result []storage.Restaurant
name := r.URL.Query().Get("name")
if result, err = h.DB.SearchRestaurantsFromDB(name); err != nil {
log.Fatal("Database Error: ", err)
}
fmt.Print(result)
api.WriteJSON(w, result)
log.Print(r.RequestURI)
}
但我尝试到达此端点,但我收到 404 not found: http://localhost:8000/project/restaurant/search?name={n}
我可以知道这里的问题吗?
P.S.there 在主函数中是 router.Mount("/project/", restaurant.NewRouter(dm))
。
我不知道 chi
但我认为你误解了路由器路径
你实际上不使用查询参数来定义路径路由器,路径上的变量如 {n}
是用于路径参数的。您使用的是查询参数。
看这里的区别:
路径参数
访问来自:http://localhost:3333/name/JohnDoe
func main() {
r := chi.NewRouter()
r.Get("/name/{name}", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hi" + chi.URLParam(r, "name")))
})
http.ListenAndServe(":3333", r)
}
查询参数
访问来自:http://localhost:3333/name?name=JohnDoe
func main() {
r := chi.NewRouter()
r.Get("/name", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hi" + r.URL.Query().Get("name")))
})
http.ListenAndServe(":3333", r)
}