Golang net/http标准库
时间:2025-1-12 20:32 作者:杨佳乐 分类: Golang
package main
import (
"fmt"
"net/http"
)
// net/http 标准库是用于构建 HTTP 客户端和服务端的强大工具。它提供了简单易用的接口,适用于从基础 HTTP 请求到构建完整的 Web 服务
// http.HandleFunc: 注册一个路由和处理函数。
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}
func goodbyeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Goodbye, World!")
}
// 中间件
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Request: %s %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
// 注册路由
// http.HandleFunc("/", handler)
// 注册多路由
mux := http.NewServeMux()
mux.HandleFunc("/hello", helloHandler)
mux.HandleFunc("/goodbye", goodbyeHandler)
fmt.Println("Starting server at :8080")
// http.ListenAndServe: 启动 HTTP 服务并监听指定端口。
// http.ListenAndServe(":8080", nil) //单路由启动
loggedMux := loggingMiddleware(mux)
http.ListenAndServe(":8080", loggedMux) // 多路由启动
// 实现自定义Handler
// type MyHandler struct{}
// func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// fmt.Fprintf(w, "This is a custom handler")
// }
// func main() {
// handler := &MyHandler{}
// http.ListenAndServe(":8080", handler)
// }
// 作为客户端发起请求
// resp, err := http.Get("https://example.com")
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// defer resp.Body.Close()
// body, _ := ioutil.ReadAll(resp.Body)
// fmt.Println(string(body))
// 发起post请求
// data := []byte(`{"key": "value"}`)
// resp, err := http.Post("https://example.com", "application/json", bytes.NewBuffer(data))
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// defer resp.Body.Close()
// fmt.Println("Status:", resp.Status)
// 自定义http请求
// import (
// "fmt"
// "io/ioutil"
// "net/http"
// "strings"
// )
// func main() {
// client := &http.Client{}
// req, err := http.NewRequest("POST", "https://example.com", strings.NewReader("key=value"))
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
// resp, err := client.Do(req)
// if err != nil {
// fmt.Println("Error:", err)
// return
// }
// defer resp.Body.Close()
// body, _ := ioutil.ReadAll(resp.Body)
// fmt.Println(string(body))
// }
// 文件上传请求
// import (
// "bytes"
// "fmt"
// "mime/multipart"
// "net/http"
// "os"
// )
// func main() {
// body := &bytes.Buffer{}
// writer := multipart.NewWriter(body)
// file, _ := os.Open("file.txt")
// defer file.Close()
// part, _ := writer.CreateFormFile("file", "file.txt")
// _, _ = io.Copy(part, file)
// writer.Close()
// req, _ := http.NewRequest("POST", "https://example.com/upload", body)
// req.Header.Set("Content-Type", writer.FormDataContentType())
// client := &http.Client{}
// resp, _ := client.Do(req)
// defer resp.Body.Close()
// fmt.Println("Status:", resp.Status)
// }
// 总结
// 性能优化
// 使用 http/2(默认支持)。
// 使用连接池。
// 启用 Gzip 压缩。
// 错误处理
// 确保关闭 resp.Body。
// 使用 log 打印详细错误信息。
}
标签: Golang标准库