上篇关于Go模板库应用的文章最后我们留下一个问题,页面模板是通过CDN
引用的BootStrap
的css
,js
文件。到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端。使用和配置过Nginx
服务器的一定知道Nginx
天然支持静态资源的访问,那么我们是不是也要借助Nginx
才能实现处理静态文件请求呢?其实不是,在最开始的文章我们说过“Go语言不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。”,这篇文章就让我们了解一下如何用Go
语言的net/http
库实现处理静态资源请求的问题。
我们先用一个简单的例子学习一下使用net/http
如何创建一个静态资源服务器,然后再应用到我们的http_demo
项目中。
Go Web 编程系列的每篇文章的源代码都打了对应版本的软件包,供大家参考。公众号中回复gohttp08
获取本文源代码
创建静态资源服务器
我们新建一个main.go
存放创建静态资源服务器和监听请求的代码,同时在相同目录下创建assets/css
和assets/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/bootstrap.min.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
上的js
和css
文件换成自己服务器上的文件链接。
<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 编程--超详细的模板库应用指南
有疑问加站长微信联系(非本文作者)