15.8 精巧的多功能网页服务器

    示例 15.20

    Logger 处理函数用 w.WriteHeader(404) 来输出 “404 Not Found”头部。

    此项技术通常很有用,无论何时服务器执行代码产生错误,都可以应用类似这样的代码:

    处理函数 调用 URL 浏览器获得响应
    HelloServer http://localhost:12345/go/hello hello, world!

    expvar 可以创建(Int,Float 和 String 类型)变量,并将它们发布为公共变量。它会在 HTTP URL /debug/vars 上以 JSON 格式公布。通常它被用于服务器操作计数。helloRequests 就是这样一个 int64 变量,该处理函数对其加 1,然后写入“hello world!”到浏览器。

    计数器对象 有一个 String() 方法,所以它实现了 expvar.Var 接口。这使其可以被发布,尽管它是一个结构体。ServeHTTP 函数使 ctr 成为处理器,因为它的签名正确实现了 http.Handler 接口。

    处理函数 调用 URL 浏览器获得响应
    FileServer 404 page not found

    FileServer(root FileSystem) Handler 返回一个处理器,它以 root 作为根,用文件系统的内容响应 HTTP 请求。要获得操作系统的文件系统,用 ,例如:

    处理函数 调用 URL 浏览器获得响应
    ArgServer http://localhost:12345/args ./elaborated_webserver.exe

    该处理函数迭代 os.Args 以打印出所有的命令行参数。如果没有指定则只有程序名称(可执行程序的路径)会被打印出来。

    每当有新请求到达,通道的 ServeHTTP 方法从通道获取下一个整数并显示。由此可见,网页服务器可以从通道中获取要发送的响应,它可以由另一个函数产生(甚至是客户端)。下面的代码片段正是一个这样的处理函数,但会在 30 秒后超时:

    处理函数 调用 URL 浏览器获得响应
    DateServer 显示当前时间(由于是调用 /bin/date,仅在 Unix 下有效)

    可能的输出:Thu Sep 8 12:41:09 CEST 2011