英文:
path param in URL in GO without any web framework
问题
在使用Go开发REST API时,我们如何使用路径参数?也就是说,URI的格式是什么?
我尝试使用类似以下的方式创建路由,但处理函数没有被调用。
请注意,我只打算使用net/http包,而不使用像gorilla mux这样的其他Web框架。
http://localhost:8765/myapp/{param1}/entries/{param2}
英文:
While developing a REST api in Go, how can we use path params? meaning to say what will be the format of the URI?
http://localhost:8765/myapp/{param1}/entries/{param2}
I tried using something like this to create the route but the handler function is not getting invoked.
Please note that, i intent to use only the net/http package , not any other web framework like gorilla mux.
答案1
得分: 2
我倾向于使用嵌套处理程序。根处理程序处理"/",它弹出路径的第一部分,将剩余部分重新赋值给req.URL.Path
(实际上就像StripPrefix
一样),通过该前缀确定哪个处理程序处理路由(如果有的话),然后链接适当的处理程序。如果该处理程序需要从路径中解析出一个ID,它可以通过相同的机制 - 弹出路径的第一部分,根据需要进行解析,然后执行操作。
这不仅没有外部依赖,而且比任何路由器都要快,因为路由是硬编码的,而不是动态的。除非路由在运行时发生变化(这将非常不寻常),否则没有必要动态处理路由。
英文:
What I tend to do is nested handlers. "/" is handled by the root handler. It pops the first part of the path, assigns the rest back to req.URL.Path
(effectively acting like StripPrefix
), determines which handler handles routes by that prefix (if any), then chains the appropriate handler. If that handler needs to parse an ID out of the path, it can, by the same mechansim - pop the first part of the path, parse it as necessary, then act.
This not only has no external dependencies, but it is faster than any router could ever be, because the routing is hard-coded rather than dynamic. Unless routing changes at runtime (which would be pretty unusual), there is no need for routing to be handled dynamically.
答案2
得分: 1
这就是为什么人们使用像 gin-gonic 这样的框架,因为在 net/http 包中实现这个并不容易,如果我理解正确的话。
否则,你需要使用 strings.Split(r.URL.Path, "/")
并从这些元素中进行处理。
英文:
Well this is why people use frameworks like gin-gonic because this is not easy to do this in the net/http package IIUC.
Otherwise, you would need to strings.Split(r.URL.Path, "/")
and work from those elements.
答案3
得分: 0
使用net/http
库,当调用localhost:8080/myapp/foo/entries/bar
时,以下代码将被触发:
http.HandleFunc("/myapp/", yourHandlerFunction)
然后在yourHandlerFunction
函数内部,手动解析r.URL.Path
以找到foo
和bar
。
请注意,如果不添加尾部的斜杠/
,它将不起作用。以下代码只有在调用localhost:8080/myapp
时才会触发:
http.HandleFunc("/myapp", yourHandlerFunction)
英文:
With net/http
the following would trigger when calling localhost:8080/myapp/foo/entries/bar
http.HandleFunc("/myapp/", yourHandlerFunction)
Then inside yourHandlerFunction
, manually parse r.URL.Path
to find foo
and bar
.
Note that if you don't add a trailing /
it won't work. The following would only trigger when calling localhost:8080/myapp
:
http.HandleFunc("/myapp", yourHandlerFunction)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论