0

我是 golang 的新手,正在使用 chi 在 golang 中提供宁静的服务。我正在尝试创建如下路线:

    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: http://localhost:8000/project/restaurant/search?name= {n}

我可以知道这里的问题吗?

PSrouter.Mount("/project/", restaurant.NewRouter(dm))在主函数中。

4

1 回答 1

4

我不知道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)
}

于 2020-01-09T01:27:48.860 回答