Go 网络编程:HTTP服务与客户端开发

发布于:2025-06-25 ⋅ 阅读:(13) ⋅ 点赞:(0)

Go 在标准库中内置了功能强大的 net/http 包,可快速构建高并发、高性能的 HTTP 服务,广泛应用于微服务、Web后端、API中间层等场景。


一、快速创建一个HTTP服务

示例:最简Hello服务
package main

import (
    "fmt"
    "net/http"
)

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

func main() {
    http.HandleFunc("/", helloHandler)
    fmt.Println("Listening on http://localhost:8080/")
    http.ListenAndServe(":8080", nil)
}

二、请求与响应对象详解

  • • http.Request:封装了客户端请求的所有信息(URL、Header、Body等)
  • • http.ResponseWriter:用于构造服务器的响应
示例:获取请求信息
func infoHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Method: %s\n", r.Method)
    fmt.Fprintf(w, "URL: %s\n", r.URL.Path)
    fmt.Fprintf(w, "Header: %v\n", r.Header)
}

三、处理URL参数与POST数据

1. 获取查询参数
func queryHandler(w http.ResponseWriter, r *http.Request) {
    name := r.URL.Query().Get("name")
    fmt.Fprintf(w, "Hello, %s!", name)
}

访问:http://localhost:8080/query?name=Go

2. 处理表单数据(POST)
func formHandler(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()
    username := r.FormValue("username")
    fmt.Fprintf(w, "Welcome, %s!", username)
}

四、自定义HTTP路由与Handler

使用 http.ServeMux
func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/hello", helloHandler)
    mux.HandleFunc("/info", infoHandler)
    http.ListenAndServe(":8080", mux)
}
使用第三方路由器(如 gorilla/muxchi 等)
// 示例略,可根据需要引入第三方库

五、构建HTTP客户端请求

Go 提供了强大的 http.Client 支持 GET/POST 等请求。

示例:GET请求
resp, err := http.Get("https://httpbin.org/get")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
示例:POST请求
data := url.Values{"name": {"Go"}}
resp, err := http.PostForm("https://httpbin.org/post", data)
defer resp.Body.Close()

六、JSON接口的处理

JSON响应
func jsonHandler(w http.ResponseWriter, r *http.Request) {
    type Resp struct {
        Status string `json:"status"`
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(Resp{"ok"})
}
JSON请求解析
func receiveJSON(w http.ResponseWriter, r *http.Request) {
    type Req struct {
        Name string `json:"name"`
    }
    var data Req
    json.NewDecoder(r.Body).Decode(&data)
    fmt.Fprintf(w, "Hello, %s", data.Name)
}

七、静态文件服务

http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("public"))))

访问 /static/index.html 实际读取 public/index.html 文件。


八、HTTP中间件的编写

中间件常用于实现日志、认证、限流等功能。

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

九、启动HTTPS服务(SSL)

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

用于生产环境时,请使用自动证书工具如 Let’s Encrypt + Caddy/Nginx 做代理。


十、总结

能力 工具与API
启动Web服务 http.ListenAndServe
构造REST接口 HandlerFunc + JSON 编解码
发起HTTP请求 http.Gethttp.Posthttp.Client
路由与中间件 ServeMux 或第三方路由器
文件服务与HTTPS http.FileServer / ListenAndServeTLS


网站公告

今日签到

点亮在社区的每一天
去签到