golang http

发布时间:2024-12-22 20:04:37

在现代互联网时代,Web应用的开发已经成为开发者们日常工作的一部分。而对于构建Web应用,一个重要的组件就是HTTP服务器。在Go语言中,我们可以通过使用http包来实现自己的HTTP服务器。其中,http.FileServer函数是Go语言中一个非常强大且方便的函数,可以帮助我们快速构建一个用于提供静态文件访问的HTTP服务器。

快速构建静态文件服务器

要构建一个基本的静态文件服务器,我们只需要使用http包中的FileServer函数即可。FileServer函数会将指定目录下的文件作为静态文件提供给浏览器。

下面是一个简单的示例:

package main

import (
	"net/http"
)

func main() {
	fs := http.FileServer(http.Dir("static"))
	http.Handle("/", fs)

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

自定义静态文件路由

http.FileServer函数默认将根目录("/")下的所有请求映射到指定目录中的文件。但有时我们希望自定义静态文件的路由规则。在Go语言中,我们可以通过使用http.StripPrefix来实现自定义路由。

以下是一个示例:

package main

import (
	"net/http"
)

func main() {
	http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
		filePath := "static" + r.URL.Path[len("/static/"):]
		http.ServeFile(w, r, filePath)
	})

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

支持缓存

在构建一个高性能的静态文件服务器时,我们通常希望能够使用缓存来提高性能。在Go语言中,我们可以通过设置http.ServeContent函数的Header字段来实现缓存功能。

以下是一个示例:

package main

import (
	"net/http"
	"os"
	"time"
)

func main() {
	http.HandleFunc("/static/", func(w http.ResponseWriter, r *http.Request) {
		filePath := "static" + r.URL.Path[len("/static/"):]
		file, err := os.Open(filePath)
		if err != nil {
			http.Error(w, "File not found.", http.StatusNotFound)
			return
		}
		defer file.Close()

		stat, err := file.Stat()
		if err != nil {
			http.Error(w, "Unable to get file stat.", http.StatusInternalServerError)
			return
		}

		http.ServeContent(w, r, filePath, stat.ModTime(), file)
	})

	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(err)
	}
}

通过设置Header的Cache-Control和Expires字段,我们可以让浏览器缓存静态文件。这样在下次访问时,浏览器会直接从缓存中加载文件,从而减少了网络传输的开销,提高了服务器性能。

相关推荐