在Golang的网络编程场景中,HTTP Header的处理是非常基础且常用的操作,无论是开发后端API服务还是调用外部接口,都需要和请求头、响应头打交道。Golang的标准库net/http提供了完善的Header处理能力,相关的操作都围绕http.Header类型展开。

Golang中HTTP Header的基础结构
Golang中的http.Header本质是一个map[string][]string类型的别名,键是Header的名称,值是对应名称的所有值组成的字符串切片。Header的名称在存储时会自动转为标准格式,比如首字母大写,中划线后的字母大写,所以我们在操作的时候不需要关心大小写问题,标准库会自动处理匹配。
可以通过下面的方式声明一个空的Header:
package main
import (
"fmt"
"net/http"
)
func main() {
// 声明一个空的Header
header := http.Header{}
fmt.Printf("Header类型: %Tn", header)
}
解析HTTP请求中的Header
当Golang作为服务端接收HTTP请求时,请求的Header信息存储在http.Request的Header字段中,我们可以通过这个字段读取客户端传递的所有请求头信息。
读取单个请求头
可以使用Get方法读取指定名称的请求头,该方法会返回该名称对应的第一个值,如果不存在则返回空字符串。也可以使用Values方法获取该名称对应的所有值组成的切片。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 读取User-Agent请求头
userAgent := r.Header.Get("User-Agent")
fmt.Printf("User-Agent: %sn", userAgent)
// 读取Accept请求头的所有值
accepts := r.Header.Values("Accept")
fmt.Printf("Accept所有值: %vn", accepts)
}
func main() {
http.HandleFunc("/test", handler)
http.ListenAndServe(":8080", nil)
}
遍历所有请求头
如果需要获取请求中的所有Header信息,可以直接遍历http.Header这个map结构,遍历的时候键已经是标准格式的Header名称。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 遍历所有请求头
for key, values := range r.Header {
fmt.Printf("Header名: %s, 值: %vn", key, values)
}
}
func main() {
http.HandleFunc("/test", handler)
http.ListenAndServe(":8080", nil)
}
设置HTTP响应头
当Golang作为服务端返回响应时,可以通过http.ResponseWriter的Header方法获取响应的Header对象,然后对其进行设置,再返回响应内容。
设置单个响应头
可以使用Set方法设置响应头,如果同一个名称的Header已经存在,Set方法会覆盖之前的所有值。如果需要添加多个同名的Header,可以使用Add方法。
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 设置Content-Type响应头
w.Header().Set("Content-Type", "application/json; charset=utf-8")
// 添加自定义响应头,不会覆盖已有值
w.Header().Add("X-Custom-Header", "test-value")
w.Header().Add("X-Custom-Header", "another-value")
// 写入响应内容
w.Write([]byte(`{"code": 0, "msg": "success"}`))
}
func main() {
http.HandleFunc("/test", handler)
http.ListenAndServe(":8080", nil)
}
删除响应头
如果需要删除某个响应头,可以使用Del方法,传入要删除的Header名称即可。
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
// 先设置响应头
w.Header().Set("Content-Type", "text/plain")
// 删除Content-Type响应头
w.Header().Del("Content-Type")
w.Write([]byte("hello world"))
}
func main() {
http.HandleFunc("/test", handler)
http.ListenAndServe(":8080", nil)
}
发起HTTP请求时设置请求头
当Golang作为客户端发起HTTP请求时,需要在构造的http.Request对象中设置请求头,然后再通过http.Client发起请求。
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
// 创建请求对象
req, err := http.NewRequest("GET", "http://ipipp.com/api/test", nil)
if err != nil {
fmt.Printf("创建请求失败: %vn", err)
return
}
// 设置请求头
req.Header.Set("User-Agent", "Golang-Client/1.0")
req.Header.Set("Authorization", "Bearer test_token_123")
req.Header.Add("Accept", "application/json")
// 创建客户端并发起请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Printf("发起请求失败: %vn", err)
return
}
defer resp.Body.Close()
// 读取响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %vn", err)
return
}
fmt.Printf("响应内容: %sn", body)
}
注意事项
- Header的名称在匹配时不区分大小写,所以读取的时候用User-Agent或者user-agent都可以正确获取到值。
- Set方法会覆盖同名的Header所有值,Add方法会追加值,需要根据场景选择合适的方法。
- 设置响应头需要在调用Write方法之前完成,因为一旦开始写入响应体,响应头就会被发送,之后再设置就不会生效了。
- 如果Header的值包含特殊字符,标准库会自动进行编码处理,不需要开发者手动处理。
GolangHTTP_Header请求头解析请求头设置修改时间:2026-06-10 12:42:20