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

作者:Kevin · 时间:2024-04-26 17:17:55 

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

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

创建静态资源服务器

我们新建一个 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/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 上的 js 和 css 文件换成自己服务器上的文件链接。


<html lang="en">
<head>
......
<link href="/static/css/bootstrap.min.css" rel="external nofollow" 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  ,验证一下我们的服务器现在是否能伺服静态文件的请求了。

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

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

来源:https://studygolang.com/articles/27005

标签:go,静态,服务器
0
投稿

猜你喜欢

  • 200行python代码实现2048游戏

    2023-02-28 16:07:21
  • 关于ASP eof与bof 区别分析

    2011-03-11 11:14:00
  • python+opencv+selenium自动化登录邮箱并解决滑动验证的问题

    2021-10-01 07:32:18
  • sql语句返回主键SCOPE_IDENTITY()

    2011-09-30 11:28:45
  • Python计算不规则图形面积算法实现解析

    2022-03-14 21:04:17
  • 优化Oracle停机时间及数据库恢复

    2010-07-20 12:54:00
  • Vue3 Reactive响应式原理逻辑详解

    2024-05-03 15:11:28
  • sqlserver/mysql按天、按小时、按分钟统计连续时间段数据【推荐】

    2024-01-27 14:23:20
  • Python Opencv使用ann神经网络识别手写数字功能

    2023-11-03 02:44:52
  • OpenCV 边缘检测

    2023-08-19 22:54:20
  • python 删除非空文件夹的实例

    2022-11-07 01:25:23
  • js实现固定区域内的不重叠随机圆

    2024-05-13 09:18:40
  • 通俗易懂了解Python装饰器原理

    2021-07-18 13:48:20
  • vue组件之间进行传值的方法

    2024-04-27 15:48:04
  • 3种适用于Python的疯狂秘密武器及原因解析

    2023-02-08 09:10:30
  • JS实现倒序输出的几种常用方法示例

    2024-04-22 13:27:15
  • 对python的unittest架构公共参数token提取方法详解

    2023-10-18 12:28:54
  • Python numpy和matlab的几点差异介绍

    2023-12-14 23:26:39
  • PHP中Http协议post请求参数

    2023-11-16 18:38:38
  • python中pandas对多列进行分组统计的实现

    2022-06-25 03:50:03
  • asp之家 网络编程 m.aspxhome.com