转到HTTP服务器:使用Map处理路由

时间:2015-08-11 15:24:35

标签: regex http go

我在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]); 
}

我知道这段代码还远未完成,但希望它能澄清我的目标。如何将pathm传入renderContent以及如何handleFunc实际处理正则表达式(基本上是任何路径)?

3 个答案:

答案 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.
}