导读:本期聚焦于小伙伴创作的《如何在Golang中处理HTTP Header?Golang请求头解析与设置方法详解》,敬请观看详情。在Golang开发中,处理HTTP请求和响应头是网络编程的常见需求。很多开发者在开发API服务或者调用第三方接口时,都会遇到需要读取、修改HTTP Header的场景。本文会详细介绍Golang中处理HTTP Header的常用方法,包括如何解析传入请求的Header信息,如何设置响应头返回给客户端,还有在发起HTTP请求时如何自定义请求头。内容会结合实际的代码示例,讲解net/http包中Header相关的核心结构和方法,帮助开发者快速掌握Golang中HTTP Header的处理技巧,解决实际开发中的相关问题。

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

如何在Golang中处理HTTP Header?Golang请求头解析与设置方法详解

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。