ZetCode

Go HTTP 静态文件

最后修改时间 2024 年 4 月 11 日

在本文中,我们将展示如何在 Go 中设置 HTTP 服务器来提供静态文件。

超文本传输协议(Hypertext Transfer Protocol (HTTP))是一种用于分布式、协作式、超媒体信息系统的应用层协议。HTTP 协议是万维网数据通信的基础。

net/http 包提供了 HTTP 客户端和服务器实现,并用于创建 GET 和 POST 请求。

静态文件是不会改变的文件。它们包括 CSS 文件、JavaScript 文件和图像;也包括不包含模板指令的纯 HTML 文件。

http.FileServer 用于提供静态文件。它返回一个处理程序,该处理程序通过文件系统的内容来处理 HTTP 请求。

提供静态文件

在第一个示例中,我们提供包含图像和 CSS 文件的 HTML 文件。

go.mod
main.go
public
├── about.html
├── css
│   └── format.css
├── img
│   └── sid.png
└── index.html

这是项目结构。

public/about.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/format.css">
    <title>About</title>
</head>
<body>

    <h2>About page</h2>

    <p>
        <a href="/">Home page</a>
    </p>
    
</body>
</html>

这是 about.html 文件。

public/index.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/format.css">
    <title>Home page</title>
</head>

<body>

    <h2>Home page</h2>

    <p>
        <a href="about.html">About page</a>
    </p>

    <figure>
        <img src="img/sid.png" alt="Sid the sloth">
        <figcaption>Sid the sloth</figcaption>
    </figure>

</body>

</html>

这是 index.html 页面。

public/css/format.css
* {
    font-size: medium;
    background-color:#2c2b2b ;
    color: #e6d7d7;
}

这是 CSS 文件。

main.go
package main

import (
    "net/http"
)

func main() {

    fs := http.FileServer(http.Dir("./public"))
    http.Handle("/", fs)

    http.ListenAndServe(":8080", nil)
}

我们设置了服务器。静态文件从 public 目录读取。

Go 提供图像示例

在以下示例中,我们使用模板文件来动态生成页面。除了模板系统,我们还设置了为模板文件中包含的 CSS 文件提供静态文件。

go.mod
main.go
public
└── css
    └── format.css
templates
└── layout.html

这是项目结构。

public/css/format.css
table {
    border-top: 1px solid #999;
    border-left: 1px solid #999;
    border-collapse: collapse;
}

td, th {
    padding: 5px;
    border-right: 1px solid #999;
    border-bottom: 1px solid #999;
}

tr:nth-child(2) {
    background-color: #c1f5f7;
}

我们有一些 CSS 代码来为 HTML 表格设置样式。

templates/layout.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="public/css/format.css">
    <title>Users</title>
</head>

<body>

    <table>
        <thead>
            <tr>
                <th>User</th>
                <th>Occupation</th>
            </tr>
        </thead>

        <tbody>
            {{ range . }}
            <tr>
                <td>{{ .Name }}</td>
                <td>{{ .Occupation }}</td>
            </tr>
            {{ end }}
        </tbody>
    </table>

</body>

</html>

在模板文件中,我们有指令可以将传入的数据合并到 HTML 表格中。format.css 文件包含在模板中,并作为静态资源提供。

main.go
package main

import (
    "html/template"
    "net/http"
    "os"
)

type User struct {
    Name       string
    Occupation string
}

func main() {

    fs := http.FileServer(http.Dir("public"))
    http.Handle("/public/", http.StripPrefix("/public/", fs))

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

        tmpl := template.Must(template.ParseFiles("templates/layout.html"))

        data := []User{
            {Name: "John Doe", Occupation: "gardener"},
            {Name: "Roger Roe", Occupation: "driver"},
            {Name: "Thomas Green", Occupation: "teacher"},
        }

        tmpl.Execute(w, data)
    })

    http.ListenAndServe(":8080", nil)
}

在代码示例中,我们设置了提供静态文件和模板引擎。

fs := http.FileServer(http.Dir("public"))
http.Handle("/public/", http.StripPrefix("/public/", fs))

静态资源来自 public 目录。

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

    tmpl := template.Must(template.ParseFiles("templates/layout.html"))

    data := []User{
        {Name: "John Doe", Occupation: "gardener"},
        {Name: "Roger Roe", Occupation: "driver"},
        {Name: "Thomas Green", Occupation: "teacher"},
    }

    tmpl.Execute(w, data)
})

所有未从 public 目录提供的资源都由模板引擎管理。在匿名函数中,我们使用 template.parseFiles 解析 layout.html 文件,并将其与数据合并。

来源

Go net/http 包 - 参考

在本文中,我们展示了如何在 Golang 中处理静态资源。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程