使用Go语言创建静态文件服务器

398 阅读4分钟
原文链接: mp.weixin.qq.com

上篇关于Go模板库应用实践的文章最后我们留下一个问题,页面模板是通过 CDN引用的 BootStrapcssjs文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过 Nginx服务器的一定知道 Nginx天然支持静态资源的访问,那么我们是不是也要借助 Nginx才能实现处理静态文件请求呢?其实不是,在最开始的文章我们说过“Go语言不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。”,这篇文章就让我们了解一下如何用 Go语言的 net/http库实现处理静态资源请求的问题。

我们先用一个简单的例子学习一下使用 net/http如何创建一个静态资源服务器,然后再应用到我们的 http_demo项目中。

Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复 gohttp08获取本文源代码

创建静态资源服务器

我们新建一个 main.go存放创建静态资源服务器和监听请求的代码,同时在相同目录下创建 assets/cssassets/js目录用于存放上篇文章页面模板使用到的静态文件。

                                

    main .go

    assets /

    └── css

    └── bootstrap. min.css

    └── js

    └── bootstrap. min.js

main.go中的代码如下:

                                    

    package main

    import "net/http"

    func main () {

    fs := http. FileServer(http .Dir( "assets/"))

    http .Handle( "/static/", http .StripPrefix( "/static/", fs ))

    http .ListenAndServe( ":8080", nil)

    }

  • 首先我们使用 http .FileServer创建一个使用给定文件系统的内容响应所有  HTTP请求的处理程序。

  • http .Handle ("/static/" ,http .StripPrefix ("/static/" ,fs )) 让文件服务器使用 assets目录下的文件响应  URL路径以  /static/开头的所有  HTTP请求。

  • assets被设置为文件服务器的文件系统根目录,文件服务器会处理以  / static 开头的 URL的请求,所以我们需要使用  http .StripPrefix () 把 static前缀去掉才能在  assets目录中搜索到请求的文件。

运行程序,然后用 cURL请求一下 css文件,看看有没有奏效。

                                        

    $ go run main .go

    $ curl -s http: //localhost:8080/static/css/styles.css

    /*!

    * Bootstrap v3.3.7 (http://getbootstrap.com)

    * Copyright 2011-2016 Twitter, Inc.

    ......

结合 gorillia/mux使用文件服务器

上面的例子中文件服务器的处理程序是注册到 net/http库提供的标准的 ServeMux(服务复用器)中的,我们 http_demo项目为了支持复杂的路由注册使用的是 gorillia/mux库提供的服务复用器。两者的工作方式不太一样,所以把文件服务器应用到我们项目里还需要做些调整才能起作用。

首先我们先把 assets目录整个拷贝到项目的根目录。

                                                    

    func RegisterRoutes(r *mux. Router) {

    // serve static file request

    fs := http. FileServer(http .Dir( "assets/"))

    serveFileHandler := http. StripPrefix("/static/" , fs)

    r .PathPrefix( "/static/").Handler (serveFileHandler)

    ......

    }

  • 使用 router .PathPrefix ("/static" ) 创建一个匹配有 /static前缀请求的路由。

  • 然后使用 route .Handler方法将文件服务器注册成路由对应的处理程序(  Handler是  * mux. Route 上的方法)。

注册好文件服务器后,我们把之前页面模板引用的 CDN上的 jscss文件换成自己服务器上的文件链接。

                                                        

    <html lang= "en">

    <head>

    ......

    <link href ="/static/css/bootstrap.min.css" rel="stylesheet" >

    </head>

    <body>

    {{ template "nav" .}}

    <div class= "container">

    {{template "content" .}}

    </div> <!-- /container -->

    <script src= "/static/js/bootstrap.min.js"></script>

    </body>

    </html>

然后重启服务器,访问之前的页面 http:localhost:/view/index,验证一下我们的服务器现在是否能伺服静态文件的请求了。

页面样式正常,现在只要在服务器这个 assets目录下的文件,我们都可以通过 http://localhost:8000/static/*路径的 URL访问到。

今天的文章对应的源码已经打包上传,公众号回复 gohttp08获取下载链接,赶快下载下来动手练习一下吧。如果文章能帮助到你,不要忘记转发、点在看分享给更多人啊。关注公众号每周第一时间获取文章更新。

另外今天的题图是不是很有趣,两个小地鼠和背景都来自一部非常经典的电影。你能说出他们三个的名字吗?快来留言吧,让我看看你们都能给出什么答案

前文回顾

深入学习用Go编写HTTP服务器

使用gorilla/mux 路由器

Go Web编程--应用数据库

Go Web编程--深入学习解析HTTP请求

Go Web 编程--超详细的模板库应用指南