我在Go中有map
路由(例如/static/stylesheets/main.css
)作为键,相应的代码作为值(实际上是一个巨大的字符串)。我只是想知道,Go中是否有一种简单的方法可以创建一个HTTP服务器,它总是检查map
的传入请求并呈现与匹配键相关的值(如果密钥存在?) / p>
到目前为止,我有......
func main() {
var m = generateMap()
http.handleFunc("/", renderContent);
}
func renderContent(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, m[path]);
}
我知道这段代码还远未完成,但希望它能澄清我的目标。如何将path
和m
传入renderContent
以及如何handleFunc
实际处理正则表达式(基本上是任何路径)?
答案 0 :(得分:2)
如果你打开不自己写的东西,那么小而且开箱即用 - 看看大猩猩多普勒。他们的工具包可以让你选择你想要的组件,所以如果你想要的只是使用正则表达式进行路由,只需添加他们的多路复用器。
我发现从路线获取变量特别有用。
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
...
vars := mux.Vars(request)
category := vars["category"]
答案 1 :(得分:1)
将地图设为http.Handler
:
type httpFiles struct {
fileMap map[string][]byte
}
func (hf httpFiles) ServeHTTP(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
w.Write(hf.fileMap[path])
}
答案 2 :(得分:1)
我建议将程序包httprouter作为最快的路由器。 Go的内置多路复用是不完整和缓慢的,没有简单的方法来捕获URL参数。
此外,您可以考虑将每个路由设为结构,以便在有多条路径时更容易处理。
此代码捕获URL参数,将其与地图的关键字进行比较,并将代码块的字符串打印到控制台。
package main
import (
"fmt"
"net/http"
"log"
mux "github.com/julienschmidt/httprouter"
)
type Route struct {
Name string
Method string
Pattern string
Handle mux.Handle
}
var codeChunk = map[string]string{ "someUrlPath" : "func printHello(){\n\tfmt.Println(\"Hello\")\n}" }
var route = Route{
"MyHandler",
"GET",
"/:keywordUrl",
MyHandler,
}
func MyHandler(w http.ResponseWriter, r *http.Request, ps mux.Params) {
// Handle route "/:keywordUrl"
w.WriteHeader(http.StatusOK)
// get the parameter from the URL
path := ps.ByName("keywordUrl")
for key, value := range codeChunk {
// Compare the parameter to the key of the map
if key != "" && path == key {
// do something
fmt.Println(value)
}
}
}
func main() {
router := mux.New()
router.Handle(route.Method, route.Pattern, route.Handle)
log.Fatal(http.ListenAndServe(":8080", router))
// browse to http://localhost:8080/someUrlPath to see
// the map's string value being printed.
}