上篇关于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 requestfs := 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 编程--超详细的模板库应用指南

Go Web编程--使用Go语言创建静态文件服务器相关推荐

  1. css文件修改后没变化 static_Go Web编程使用Go语言创建静态文件服务器

    上篇关于Go模板库应用实践的文章最后我们留下一个问题,页面模板是通过 CDN引用的 BootStrap的 css, js文件.到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响 ...

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

    上篇关于Go模板库应用的文章最后我们留下一个问题,页面模板是通过CDN引用的BootStrap的css,js文件.到目前位置我们的服务器还无法伺服客户端的静态文件请求把服务器磁盘上的文件响应给客户端. ...

  3. nginx静态文件服务器_Linux分享文件?快速创建静态文件服务器

    一. 需求 Linux对于开发者来说极其友好,但是由于国内主流办公产品相关的生态较为匮乏,因此如何使用Linux去分享文件是一件十分头疼的问题. 对于这个问题,可以直接使用静态文件服务器解决部分需求, ...

  4. html语言技术基础,第2章Web编程基础HTML语言技术方案.ppt

    通过Internet浏览世界各地的网络资源,或者要把信息通过Internet以Web方式发布到全球,就必须使用网页.网页就是用户在浏览器上看到的一个个画面.通过网页,即便是一个不懂计算机的人,也能借助 ...

  5. set-cookie 和 cookie 的区别_Go Web 编程如何确保Cookie数据的安全传输

    什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.通常, ...

  6. Go Web编程--解析JSON请求和生成JSON响应

    现在无论是网站.App.小程序还是移动端H5页面应用,都是采用前端与后端单独部署,相互之间以API接口交互的形式构建而成的.因为在结合可读性.编码数据大小和开发者使用难度上都JSON格式是一个比较好的 ...

  7. Go Web编程--给自己写的服务器添加错误和访问日志

    错误日志和访问日志是一个服务器必须支持的功能,我们教程里使用的服务器到目前为止还没有这两个功能.正好前两天也写了篇介绍logrus日志库的文章,那么今天的文章里就给我们自己写的服务器加上错误日志和访问 ...

  8. Go Web 编程--如何确保Cookie数据的安全传输

    什么是Cookie Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.通常, ...

  9. 使用Go语言创建WebSocket服务

    今天介绍如何用Go语言创建WebSocket服务,文章的前两部分简要介绍了WebSocket协议以及用Go标准库如何创建WebSocket服务.第三部分实践环节我们使用了gorilla/websock ...

最新文章

  1. SAP WM LT10事务代码的一个坑?
  2. 畅通工程 HDU - 1233 
  3. boost::test模块测试从数据集对主测试套件的访问
  4. 深度学习之基于Tensorflow2.0实现ResNet50网络
  5. 微软:Win11很受欢迎、正式版将于秋季如期发布
  6. 【Java】对Java构造器参数问题的若干思考
  7. android怎么刷新活动,Android 如何刷新当前activity的显示数据?
  8. 解决sqlalchemy连接mysql报错ModuleNotFoundError: No module named ‘pymysql‘
  9. IntelliJ IDEA 2019.1.1 预览版发布,以及对旧版本的更新
  10. 综合应用WPF/WCF/WF/LINQ之一:DEV-WOW 作品源代码公布
  11. 反向题在测试问卷信效度_[问卷的信度和效度分析]问卷信度和效度分析
  12. php包含大马执行,分析一个常见的php大马并且解码过程
  13. Linux查看网卡是千兆还是万兆网卡
  14. Android 多渠道包
  15. [Error Msg] The root link_base has an inertia specified in the URDF, but KDL does not support ...
  16. 为什么要从 Windows 7 升级到 Windows 10?
  17. 工程建设项目综合信息管理系统
  18. html 在线测试 鱼缸,五大浏览器功耗(电量消耗)测试:IE9领先
  19. 软件测试之第三方快捷支付_支付宝遭遇最强对手:银联正面PK快捷支付
  20. 2021年湖南卫生副高考试成绩查询,2021年湖南卫生资格成绩查询时间及查分入口【6月4日起】...

热门文章

  1. SQL Server Pivot 隐藏group
  2. (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
  3. auto_cmdb--01之models.py建表
  4. Asp.NET的DESAES加密算法(转载)
  5. 创建一个简单的ArcGIS Server ASP.NET网页
  6. IIS6.0不支持ASP的解决办法
  7. DTS开发记录(5)-- 挑战增量导出
  8. python线程安全队列用法
  9. 读懂Android中的代码混淆
  10. Notes:DOM的事件模拟