使用Go語言建立靜態文件服務器

上篇關於Go模板庫應用的文章最後咱們留下一個問題,頁面模板是經過CDN引用的BootStrapcssjs文件。到目前位置咱們的服務器還沒法伺服客戶端的靜態文件請求把服務器磁盤上的文件響應給客戶端。使用和配置過Nginx服務器的必定知道Nginx自然支持靜態資源的訪問,那麼咱們是否是也要藉助Nginx才能實現處理靜態文件請求呢?其實不是,在最開始的文章咱們說過「Go語言不須要依賴任何第三方組件就能構建並啓動一個高併發的 HTTP 服務器。」,這篇文章就讓咱們瞭解一下如何用Go語言的net/http庫實現處理靜態資源請求的問題。css

咱們先用一個簡單的例子學習一下使用net/http如何建立一個靜態資源服務器,而後再應用到咱們的http_demo項目中。html

Go Web 編程系列的每篇文章的源代碼都打了對應版本的軟件包,供你們參考。公衆號中回覆gohttp08獲取本文源代碼數據庫

建立靜態資源服務器

咱們新建一個main.go存放建立靜態資源服務器和監聽請求的代碼,同時在相同目錄下建立assets/cssassets/js目錄用於存放上篇文章頁面模板使用到的靜態文件。編程

main.go
assets/
└── css
    └── bootstrap.min.css
└── js
    └── bootstrap.min.js
複製代碼

main.go中的代碼以下:bootstrap

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文件,看看有沒有奏效。bash

$ 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上的jscss文件換成本身服務器上的文件連接。curl

<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 編程--超詳細的模板庫應用指南

相關文章
相關標籤/搜索