«

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标准库