📜  Go语言 HTTP服务器(1)

📅  最后修改于: 2023-12-03 15:15:25.073000             🧑  作者: Mango

Go语言 HTTP服务器

Go语言是一种跨平台、高效率的编程语言。其内置的库中包含了丰富的工具和API,使得网络编程变得更加轻松和高效。其中,Go语言的HTTP库是非常人性化、灵活和高可定制的。

HTTP服务器

我们可以使用Go语言的net/http包来创建一个HTTP服务器。下面是一个最简单的例子,运行它可以启动一个HTTP服务器,监听本地的8888端口并返回“Hello, World!”:

package main

import (
    "net/http"
    "io"
)

func handler(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8888", nil)
}

在这个例子中,我们首先定义了一个叫做handler的函数,它会被我们的HTTP服务器调用来处理来自客户端的请求。handler函数接收两个参数:一个叫做whttp.ResponseWriter类型的变量,以及一个叫做r*http.Request类型的指针。在这个例子中,我们简单地使用io.WriteString()函数将“Hello, World!”写入w

接下来的main函数注册了我们的handler函数,并使用http.ListenAndServe()函数启动了HTTP服务器。ListenAndServe()函数的第一个参数是服务器监听的TCP地址,第二个参数是用来处理传入的请求的处理器。在这个例子中,我们传递了nil,表示使用默认的HTTP请求处理器。

运行程序后,我们可以在浏览器中访问http://localhost:8888/,就可以看到“Hello, World!”这个返回值了。这是一个非常简单的例子,但是它展示了一个基本的HTTP服务器应该如何创建。

路由处理

在实际的应用中,我们可能需要让服务器针对不同的URL返回不同的内容。 Go语言的net/http包提供了 http.HandleFunc() 函数,这个函数的作用就是让我们能够高效地处理HTTP路由。下面是一个例子:

package main

import (
    "fmt"
    "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to our homepage!")
}

func contact(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "To get in touch, please send an email to support@gmail.com")
}

func main() {
    http.HandleFunc("/", homePage)
    http.HandleFunc("/contact", contact)
    http.ListenAndServe(":8000", nil)
}

在这个例子里,我们定义了两个HTTP请求处理函数。homePage()函数处理“/”URL的请求,contact()函数处理“/contact”URL的请求。fmt.Fprintf()函数将文本显示在浏览器中。

接下来的main函数注册了homePagecontact函数,并使用http.ListenAndServe()函数启动了HTTP服务器。在浏览器中访问http://localhost:8000/http://localhost:8000/contact 这两个URL就可以看到不同的返回内容了。

静态文件处理

我们也可以使用Go语言来处理静态文件。使用net/http包,我们可以轻松地将文件提供给用户。下面是一个简单的例子:

package main

import (
    "log"
    "net/http"
)

func main() {
    // 设置静态文件访问路径和存放路径
    http.Handle("/", http.FileServer(http.Dir("./static")))
    // 定义端口
    port := ":8000"

    // 启动服务器
    err := http.ListenAndServe(port, nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
        return
    }
}

在上述代码中,我们使用了http.Dir()来指定要提供的静态文件所在的目录。接下来,我们将这个http.Dir()对象传递给http.FileServer()函数,这个函数会返回一个http.Handler对象,用来处理文件服务器上的所有文件。最后,我们使用http.Handle()函数将这个http.Handler对象挂在到"/"这个路由上,使用http.ListenAndServe()来启动服务器。

在这个例子中,我们从"static"文件夹中提供文件的访问。确保"./static"目录存在,并且里面包含了一些静态的HTML和CSS文件。现在,我们可以在浏览器中访问http://localhost:8000/,这里就可以看到我们提供的静态文件了。

包装器

在Go语言中,我们可以创建包装器(middleware)把HTTP请求处理器串起来,从而在执行HTTP请求处理器之前或之后对请求进行一些操作。下面是一个HTTP请求包装器的例子:

package main

import (
    "fmt"
    "net/http"
)

// 包装器函数
func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("Middleware is processing request")
        next.ServeHTTP(w, r)
        fmt.Println("Middleware works after request is complete")
    })
}
// 请求处理函数
func homePage(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Welcome to our homepage!")
}

func main() {
    // 创建多个包装器
    wrapHandlerWithPath := loggingMiddleware(http.HandlerFunc(homePage))
    // 注册路由
    http.Handle("/", wrapHandlerWithPath)

    // 设置端口
    port := ":8000"

    // 启动服务器
    err := http.ListenAndServe(port, nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
        return
    }
}

在这个例子中,我们在loggingMiddleware()函数中创建了一个HTTP请求包装器。这个函数接收一个HTTP句柄next作为参数,返回一个HTTP句柄函数,用来执行它的任务。在这个包装器函数中,我们使用了http.HandlerFunc来创建了一个新的http.Handler对象,并在它里面执行了处理逻辑。在这个逻辑之间,我们加入了自己的“日志记录器”,这样就能够记录下每个请求的处理信息了。

main()函数中,我们首先创建了一个叫做wrapHandlerWithPath的包装器,使用loggingMiddleware()函数把homePage函数做为传入参数,这样,homePage()函数就成了一个HTTP处理器。接下来,我们使用http.Handle()函数来注册路由。最后,我们使用http.ListenAndServe()函数来监听端口并启动服务器。

现在,我们可以在浏览器中访问http://localhost:8000,你就会看到我们定义的包装器对请求进行的操作了。

结论

通过上述例子,我们已经能够看到Go语言中HTTP服务器的简单使用。但是,Go语言还提供了丰富的网络编程工具和API来处理更多的HTTP服务器任务,比如cookie、session、Websocket、SSL客户端身份验证、流量限制、并发控制等等。所以,我们可以使用Go语言开发出丰富多样的、功能强大的HTTP服务器,满足不同的需求。