带有url参数和mysql数据库的go-chi路由器工作不正常
我是刚来golang的新手,正在使用chi在golang进行restful服务。我正在尝试创建一条路线,如下所示:带有url参数和mysql数据库的go-chi路由器工作不正常,mysql,go,go-chi,Mysql,Go,Go Chi,我是刚来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})
func NewRouter(dm *storage.DatabaseManager) chi.Router {
var router = chi.NewRouter()
router.Method("POST", "/restaurant/search?name={name}",
&SearchRestaurants{DB: dm})
}
以下是我如何从mysql数据库获取数据:
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:
{n}
我可以知道这里的问题吗
另外,在主功能中有
router.Mount(“/project/”,restaurant.NewRouter(dm))
。我不知道chi
,但我想你误解了路由器路径
实际上,您没有使用查询参数来定义路径路由器,路径上的变量如{n}
是用于路径参数的。您使用的是一个查询参数
请看这里的区别:
路径参数
访问地址:
func main(){
r:=chi.NewRouter()
r、 Get(“/name/{name}”),func(w http.ResponseWriter,r*http.Request){
w、 写入([]字节(“hi”+chi.URLParam(r,“name”))
})
http.listendServe(“:3333”,r)
}
查询参数
访问地址:
func main(){
r:=chi.NewRouter()
r、 Get(“/name”,func(w http.ResponseWriter,r*http.Request){
w、 写入([]字节(“hi”+r.URL.Query().Get(“name”))
})
http.listendServe(“:3333”,r)
}
我相信正确的端点url应该是http://localhost:8000/restaurant/search?name={n}
而且,由于您的端点使用POST
方法注册。然后从浏览器中点击它将导致404错误。你应该试着用POST方法点击它谢谢你的回答,但是我忘了说在主函数中有router.Mount(“/project/”,restaurant.NewRouter(dm))@mrka@Hunssh您能否尝试从路由器.Mount(“/project/
”)中删除第二个/
?尝试执行路由器.Mount(/project),restaurant.NewRouter(dm))