如何在Golang中实现HTTP服务器_处理路由和请求响应

13次阅读

go http服务器核心是net/http库,用http.HandleFunc或ServeMux注册处理器,通过r.Method、r.URL.Query()等解析请求,用w.WriteHeader、w.Header()和json.NewEncoder构造响应。

如何在Golang中实现HTTP服务器_处理路由和请求响应

在 Go 中实现 HTTP 服务器,核心是使用标准库 net/http,它轻量、高效且无需额外依赖。处理路由和请求响应的关键在于:用 http.HandleFunchttp.ServeMux 注册路径处理器,并在处理器函数中解析请求、构造响应。

基础 HTTP 服务器:监听与响应

最简服务只需调用 http.ListenAndServe,配合一个处理函数:

package main  import (     "fmt"     "net/http" )  func main() {     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {         fmt.Fprintf(w, "Hello, World!")     })     http.ListenAndServe(":8080", nil) }

这里 nil 表示使用默认的 http.DefaultServeMux,所有注册的路径都由它分发。

自定义路由:用 ServeMux 管理多路径

显式创建 http.ServeMux 更清晰,便于组织和复用:

立即学习go语言免费学习笔记(深入)”;

  • mux.HandleFunc("/users", usersHandler) 注册具体路径
  • mux.Handle("/api/", http.StripPrefix("/api", apiHandler)) 处理子路径前缀
  • 支持通配符匹配(如 /Static/ 匹配所有以该前缀开头的路径)

注意:路径末尾是否带 / 决定匹配行为 —— "/users/" 会匹配 /users/123,但不匹配 /users;而 "/users" 只精确匹配该路径。

解析请求:方法、参数与数据体

在处理器函数中,可通过 *http.Request 获取完整上下文:

  • r.Method 判断是 GET、POST、PUT 等
  • r.URL.Query().Get("id") 获取 URL 查询参数
  • r.FormValue("name") 同时支持查询参数和表单数据(自动调用 ParseForm
  • io.ReadAll(r.Body) 读取 json 或原始请求体(注意:Body 只能读一次,需提前保存)

对 JSON 请求,常用 json.NewDecoder(r.Body).Decode(&data) 直接反序列化。

构造响应:状态码、头信息与格式化输出

响应通过 http.ResponseWriter 控制:

  • w.WriteHeader(http.StatusCreated) 显式设置状态码(默认是 200)
  • w.Header().Set("Content-Type", "application/json; charset=utf-8") 设置响应头
  • json.NewEncoder(w).Encode(result) 安全输出 JSON(自动处理编码与错误)
  • 返回 html 时,建议用 template.ParseFiles 渲染,避免字符串拼接

务必确保在调用 WriteHeader 或首次写入 w 后,不能再修改 Header —— 否则会被忽略。

text=ZqhQzanResources