英文:
Path parameters with arbitrary depth in Gorilla/Mux
问题
我一直在努力创建一个API,它可以通过读取JSON文件的内容来发送JSON响应。
data.json
{
"data_1" : {
"depth2" : {
"depth3" : "data 1的值"
}
},
"data_2" : {
"depth2" : {
"depth3" : "data 2的值"
}
},
"data_3" : {
"depth2" : {
"depth3" : "data 3的值"
}
}
}
我想创建一个动态嵌套路由系统,当客户端请求/api/data_1/depth2
时,我希望响应如下:
{
"depth3" : "data 1的值"
}
请注意,请求路径可以无限深...例如/api/data_1/depth2
或/api/data_1/depth2/depth3
甚至/api/data_1/depth2/depth3/depth4
(取决于data.json),这意味着我不能像/api/{var_1}/{var_2}
这样设置路径,因为它的深度是固定的(即2层)。
我需要在我的代码中解决这个问题。
server.go
package main
import (
....
....
)
func main() {
// 我在项目中使用Gorilla/mux
router := mux.NewRouter()
// 处理请求
router.HandleFunc("/api/这里应该写什么?", ApiHandler)
// 启动服务器
log.Fatal(http.ListenAndServe(":8080", router))
}
我已经有一个函数NestedLookUp(data map[string]interface{}, key[]string)
,它将在ApiHandler
中调用,如果键是["data_1", "depth2", ...]
,它将从嵌套的map[string]interface{}
中返回数据。我只是在弄清楚router
的正确路由方面遇到了问题。
英文:
I've been working on making a API that would send a json response by reading contents from a json file
data.json
{
"data_1" : {
"depth2" : {
"depth3" : "Value of data 1"
}
},
"data_2" : {
"depth2" : {
"depth3" : "Value of data 2"
}
},
"data_3" : {
"depth2" : {
"depth3" : "Value of data 3"
}
}
}
I want to make a dynamic nested routing system where if the client requests for, say /api/data_1/depth2
I want the response to be like
{
"depth3" : "Value of data 1"
}
Let me make it clear that the request path can be indefinitely deep... like /api/data_1/depth2
or /api/data_1/depth2/depth3
or even /api/data_1/depth2/depth3/depth4
(depending upon data.json) which means I cant make my paths like /api/{var_1}/{var_2}
since its depth is fixed (ie 2 layers)
I need help in solving this in my code
server.go
package main
import (
....
....
)
func main() {
// I'm using Gorilla/mux in my project
router := mux.NewRouter()
// Handle requests
router.HandleFunc("/api/what_should_I_write_here?", ApiHandler)
// Starting Server
log.Fatal(http.ListenAndServe(":8080", router))
}
I already have a function NestedLookUp(data map[string]interface{}, key[]string)
that will return data from a nested map[string]interface{}
if the key is ["data_1", "depth2" ...]
called inside ApiHandler
. I only have problem figuring the correct route for my router
答案1
得分: 2
只是为了详细说明我的评论,如果存在无限深度,为什么不这样获取深度路径呢?
func main() {
r := mux.NewRouter()
sub := r.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
depthPath := q.Get("depthPath")
depthPathArr := strings.Split(depthPath, "-")
// depthPath []string{1, 2, 3, 4, 5}
// 编写一个函数来遵循 depthPath
})
srv := &http.Server{
Handler: r,
Addr: "localhost:7890",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
英文:
Just to elaborate my comment, if there's an indefinite depth, why don't you get your depth path like so?
func main() {
r := mux.NewRouter()
sub := r.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query()
depthPath := q.Get("depthPath")
depthPathArr := strings.Split(depthPath, "-")
// depthPath []string{1, 2, 3, 4, 5}
// write function that follow the depthPath
})
srv := &http.Server{
Handler: r,
Addr: "localhost:7890",
WriteTimeout: 15 * time.Second,
ReadTimeout: 15 * time.Second,
}
log.Fatal(srv.ListenAndServe())
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论