Go 语言(Golang)是一种静态类型的编译型语言,由 Google 开发。它在网络编程方面非常强大,特别是 HTTP 协议的处理。

HTTP 服务器

创建一个简单的 HTTP 服务器,可以处理 GET 请求:

package main

import (
    "fmt"
    "net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", helloHandler)
    http.ListenAndServe(":8080", nil)
}

HTTP 客户端

创建一个简单的 HTTP 客户端,发送 GET 请求:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("http://example.com")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println("Response:", string(body))
}

HTTP 方法

除了 GET 请求,还可以处理 POST、PUT、DELETE 等 HTTP 方法:

func main() {
    http.HandleFunc("/post", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "POST" {
            // 处理 POST 请求
        }
    })

    http.HandleFunc("/put", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "PUT" {
            // 处理 PUT 请求
        }
    })

    http.HandleFunc("/delete", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "DELETE" {
            // 处理 DELETE 请求
        }
    })

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

请求和响应

可以访问请求的详细信息,如 URL、Header、Body 等,也可以设置响应的状态码和 Header:

func handler(w http.ResponseWriter, r *http.Request) {
    for name, headers := range r.Header {
        for _, header := range headers {
            fmt.Fprintf(w, "%s: %s\n", name, header)
        }
    }
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, `{"status": "ok"}`)
}

中间件

Go 语言没有内置的中间件概念,但可以通过装饰器模式实现类似的功能:

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL.Path)
        next.ServeHTTP(w, r)
    })
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })

    http.Handle("/", loggingMiddleware(http.DefaultServeMux))
    http.ListenAndServe(":8080", nil)
}

HTTPS

要创建一个 HTTPS 服务器,需要提供 TLS 证书和私钥:

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello, World!")
    })

    err := http.ListenAndServeTLS(":8443", "cert.pem", "key.pem", nil)
    if err != nil {
        log.Fatal(err)
    }
}