HTTP服务器的搭建
要使用Golang构建一个HTTP服务器,需实例化net/http包中的ServerMux类型,并注册各种处理函数以进行特定的路由。例如,我们可以使用`http.HandleFunc()`方法注册一个处理器函数,用于响应指定的URL路径。下面是一个简单的示例代码,展示了如何创建一个最基本的HTTP服务器,并处理根请求:
```go package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") }) http.ListenAndServe(":8080", nil) } ``` 在上述代码中,我们使用`http.HandleFunc()`方法将根URL路径`/`与一个处理函数关联起来。当有请求访问根URL时,我们通过`fmt.Fprintf()`方法向响应写入"Hello, World!"。路由和中间件
构建Web应用时,通常需要处理多个URL路径。为此,Golang Web包提供了一个名为ServerMux的路由器类型,用于根据不同的URL路径调用不同的处理函数。 除了路由之外,中间件也是Web开发中的重要概念。中间件是在处理程序之前或之后执行的函数,可用于添加额外的功能,如身份验证、日志记录和错误处理等。在Golang Web开发中,中间件是一种非常常见的模式,通过使用`net/http`包中的`http.HandlerFunc`类型,可以很容易地实现中间件。下面是一个使用Golang Web包实现路由和中间件的示例代码:
```go package main import ( "fmt" "net/http" ) func main() { router := http.NewServeMux() router.HandleFunc("/", Logger(HelloHandler)) http.ListenAndServe(":8080", router) } func HelloHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") } func Logger(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { fmt.Println("Logging...") next.ServeHTTP(w, r) } } ``` 在上述代码中,我们首先创建了一个新的ServerMux实例,并使用`http.NewServeMux()`方法进行初始化。然后,我们将根URL路径`/`与一个处理函数`HelloHandler`关联起来,并将其包装在一个名为Logger的中间件函数中。此中间件函数在调用处理函数之前打印日志,并在处理函数完成后继续处理流程。Cookie和会话管理
随着Web应用的发展,Cookie和会话管理变得越来越重要。Golang的Web包提供了简单易用的方法,用于访问和设置HTTP头中的Cookie,并管理用户会话。下面是一个使用Golang Web包处理Cookie和会话的示例代码:
```go package main import ( "fmt" "net/http" "time" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { // 设置Cookie expiration := time.Now().Add(24 * time.Hour) cookie := http.Cookie{Name: "username", Value: "John", Expires: expiration} http.SetCookie(w, &cookie) // 读取Cookie username, err := r.Cookie("username") if err != nil { fmt.Fprintf(w, "Error reading cookie: %s", err.Error()) return } fmt.Fprintf(w, "Hello, %s!", username.Value) }) http.ListenAndServe(":8080", nil) } ``` 在上述代码中,我们通过`http.SetCookie()`方法设置了一个名为"username"的Cookie,并将其保存到响应的HTTP头中。接着,我们通过`r.Cookie()`方法读取了名为"username"的Cookie,并将其值打印到响应中。