专栏首页网管叨bi叨Go Web编程--使用Go语言创建静态文件服务器

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

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

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

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

创建静态资源服务器

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

main.goassets/└── 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访问到。

前文回顾

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

使用gorilla/mux 路由器

Go Web编程--应用数据库

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

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

本文分享自微信公众号 - 网管叨bi叨(kevin_tech),作者:KevinYan11

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 修正《用Docker快速搭建Go开发环境》文章中的一处错误

    上周写的文章《五分钟用Docker快速搭建Go开发环境》,文章发出去后有不少阅读量,而且从后台看的数据 60%的人都读完了。今天我自己用下面命令往 容器里的 G...

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

    之前这个系列的文章一直在讲用 Go语言怎么编写HTTP服务器来提供服务,如何给服务器配置路由来匹配请求到对应的处理程序,如何添加中间件把一些通用的处理任务从具体...

    KevinYan
  • Go Web编程--解析JSON请求和生成JSON响应

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

    KevinYan
  • Web-第三十二天 WebLogic中间件【悟空教程】

    中间件(middleware)是基础软件的一大类, 属于可复用软件的范畴. 顾名思义,中间件处于操作系统软件与用户的应用软件的中间.

    奋斗蒙
  • 医学影像公开数据集

    医学影像数据是非常珍贵的资源,收集和标注要耗费很大的人力和财力。今天这篇文章我将分享目前为止做过的医学影像诊断的一些公开数据集。 1、数字视网膜图像的血管提取...

    用户7498388
  • Arcgis for JavaSctipt之常用Layer详解

    概述:Arcgis for Javasctipt中常见的layer有动态图层(ArcGISDynamicMapServiceLayer

    lzugis
  • 中间件渗透测试之JBoss

    该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有...

    HACK学习
  • 入门 node.js 你必须知道的那些事

    exports 是 module.exports 的一个引用,意思就是指向同一块内存地址,node 中真正生效的是 module.exports, 修改 exp...

    IT派
  • 列举一下项目中使用的产品和技术

    浏览器兼容水平: IE7-10, Firefox和Chrome最新版 开发环境: Windows7+Visual Studio 2010+Oracle Tort...

    八哥
  • HP DL380 G5服务器创建RAID

    这台HP DL380 G5已经稳定运行了好几年的时间了,Data日渐增多,起初的Disk容量已经不能满足现在的需求,加上Disk已经运行了几万小时,读写能...

    行 者

扫码关注云+社区

领取腾讯云代金券