使用 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)
}