在go中,手动调用http.FileServer和/或什么是http处理程序

时间:2016-05-17 23:01:41

标签: go

我是一位经验丰富的程序员,但是很新。如果这是一个明显的问题或良好的踩踏路径,请提前道歉。我仍然对语言及其语义有所了解。

我试图创建一个Web服务器

  1. 检查HTTP请求
  2. 根据请求的结果,提供特定静态文件夹
  3. ,即简化的伪代码看起来像

    的东西
    import (
        "io"
        "net/http"
        "fmt"
        "strings"
        "encoding/base64"
    )
    
    func examineRequest(request *http.Request) {
        //looks at request header
        if(request headers have one thing){
            return "foo"
        }
        return "bar"
    }
    
    func processRequest(responseWriter http.ResponseWriter, request *http.Request) {
        folderToServe = examineRequest(request);
        if folderToServe == "bar" {
            //serve static files from the ./static/bar folder
    
            //go freaks out if I try these
            //http.Handle("/", http.FileServer(http.Dir("./static/bar")))      
            //http.FileServer(http.Dir("./static/bar")()
    
        }
        else if folderToServer == "foo" {
            //serve static files from the ./static/foo folder
    
            //go freaks out if I try these
            //http.Handle("/", http.FileServer(http.Dir("./static/foo")))      
            //http.FileServer(http.Dir("./static/foo")()
        }
    }
    
    func main(){
        http.HandleFunc("/", processRequest)  
        //http.Handle("/", http.FileServer(http.Dir("./static")))      
    }
    

    经验丰富的程序员可能已经发现了问题。我在processRequest中执行我的考试,因此,调用Handle为时已晚 - 但是,你不能为go中的同一路径注册多个句柄,并且嵌套句柄会调用freak出去。

    我虽然处理程序可能类似于其他语言中的匿名函数并尝试调用它 - 但是也是这样。

    那么 - 有没有办法手动调用从http.FileServer(http.Dir("./static"))调用返回的处理程序?

    在这里问这个问题是否正确?

    http模块上下文中的处理程序究竟是什么?

1 个答案:

答案 0 :(得分:3)

使用http.FileServer(http.Dir("./static/foo")).ServeHTTP(w, req)

//修改

http.FileServer返回http.Handler,后者又提供ServerHTTP方法。