Golang如何处理HTTP Header_Golang HTTP Header处理示例

Go语言通过http.Header处理HTTP头,底层为map[string][]string。使用r.Header.Get("Key")读取请求头单值,r.Header["Key"]获取所有值;响应头通过w.Header().Set或Add设置,需在写响应前完成。示例包括获取User-Agent、设置Content-Type及客户端自定义Header。注意键名自动规范化,敏感头由系统管理。

在Go语言中处理HTTP请求和响应的Header非常直观,主要通过http.Header类型来操作。Header本质上是一个键值对映射(key-value map),每个键可以对应多个值,因此底层结构是map[string][]string。下面介绍常见操作并附上实用示例。

读取HTTP请求Header

在HTTP处理器中,可以通过http.Request对象的Header字段读取客户端发送的Header信息。

常用方法包括:

  • req.Header.Get("Key"):获取指定键的第一个值(推荐用于单值Header)
  • req.Header["Key"]:返回该键对应的所有值切片
  • req.Header.Values("Key"):获取所有值(注意不是标准方法,需手动遍历)
注意:Header.Get()会自动将键名转为规范格式(如"content-type"变为"Content-Type")

示例代码:

package main

import (
    "fmt"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    // 获取User-Agent
    userAgent := r.Header.Get("User-Agent")
    fmt.Fprintf(w, "User-Agent: %s\n", userAgent)

    // 获取所有Accept语言
    accepts := r.Header["Accept-Language"]
    fmt.Fprintf(w, "Accept-Language: %v\n", accepts)

    // 遍历所有Header
    for key, values := range r.Header {
        fmt.Fprintf(w, "%s: %v\n", key, values)
    }
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

设置HTTP响应Header

通过http.ResponseWriterHeader()方法可以设置响应Header,在调用w.Write()w.WriteHeader()前生效。

常用方式:

  • w.Header().Set("Key", "Value"):设置单个值(覆盖已有)
  • w.Header().Add("Key", "Value"):追加值(保留原有)
  • w.Header().Set("Content-Type", "application/json"):常用于指定返回类型

示例:

func jsonHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Header().Set("X-App-Version", "1.0.0")
    w.Header().Add("Set-Cookie", "session=abc123")
    w.Header().Add("Set-Cookie", "theme=dark")

    w.WriteHeader(http.StatusOK)
    fmt.Fprintf(w, `{"message": "Hello"}`)
}

修改请求Header(客户端场景)

当使用http.Client发起请求时,可以自定义请求Header。

func makeRequest() {
    client := &http.Client{}
    req, _ := http.NewRequest("GET", "https://httpbin.org/headers", nil)

    // 设置请求头
    req.Header.Set("Authorization", "Bearer token123")
    req.Header.Set("X-Request-ID", "12345")
    req.Header.Add("Accept", "application/json")

    resp, _ := client.Do(req)
    defer resp.Body.Close()

    // 读取响应内容...
}

常见注意事项

  • Header键名不区分大小写,Go会自动规范化(如content-typeContent-Type
  • 修改Header必须在写入响应体之前完成
  • 使用Get()获取单值更安全,避免手动取[0]导致越界
  • 敏感Header如HostContent-Length由系统自动管理,不建议手动设置

基本上就这些。Golang的HTTP Header处理简洁明了,合理使用SetAddGet即可满足大多数场景需求。