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)
}
}