18

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

 4 years ago
source link: https://studygolang.com/articles/27005
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

uE3eqq3.jpg!web

上篇关于 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 ,验证一下我们的服务器现在是否能伺服静态文件的请求了。

6zMBfiJ.png!web

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

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

前文回顾


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK