golang将结构体编码为HTTP Header字段插件库go-httpheader的使用
go-httpheader - Golang将结构体编码为HTTP Header字段的插件库
go-httpheader 是一个用于将结构体编码为HTTP Header字段的Go语言库。
安装
go get github.com/mozillazg/go-httpheader
使用示例
下面是一个完整的使用示例,展示如何将结构体编码为HTTP Header:
package main
import (
"fmt"
"net/http"
"github.com/mozillazg/go-httpheader"
)
// 定义Options结构体,包含各种类型的字段
type Options struct {
hide string // 未导出的字段会被忽略
ContentType string `header:"Content-Type"` // 自定义header名称
Length int // 自动转换为字符串
XArray []string `header:"X-Array"` // 数组字段
TestHide string `header:"-"` // 使用"-"标记忽略该字段
IgnoreEmpty string `header:"X-Empty,omitempty"` // 空值时忽略
IgnoreEmptyN string `header:"X-Empty-N,omitempty"` // 非空值时包含
CustomHeader http.Header // 直接使用http.Header类型
}
func main() {
// 创建Options实例并设置值
opt := Options{
hide: "hide", // 未导出字段,不会出现在header中
ContentType: "application/json",
Length: 2,
XArray: []string{"test1", "test2"},
TestHide: "hide", // 被标记忽略的字段
IgnoreEmptyN: "n", // 非空值会被包含
CustomHeader: http.Header{
"X-Test-1": []string{"233"},
"X-Test-2": []string{"666"},
},
}
// 将结构体编码为http.Header
h, _ := httpheader.Header(opt)
fmt.Printf("%#v", h)
// 输出结果:
// http.Header{
// "X-Test-1": []string{"233"},
// "X-Test-2": []string{"666"},
// "Content-Type": []string{"application/json"},
// "Length": []string{"2"},
// "X-Array": []string{"test1", "test2"},
// "X-Empty-N": []string{"n"},
// }
// 解码示例:将header解码回结构体
var decode Options
httpheader.Decode(h, &decode)
}
功能说明
-
字段控制:
- 未导出的字段(小写开头)会被自动忽略
- 使用
header:"-"
标记可以显式忽略字段 - 使用
omitempty
选项可以在字段为空值时忽略
-
类型支持:
- 支持基本类型(自动转换为字符串)
- 支持数组/切片类型
- 支持直接使用
http.Header
类型
-
自定义header名称:
- 通过
header:"自定义名称"
标签可以指定header字段名
- 通过
-
编解码双向支持:
Header()
函数用于将结构体编码为http.HeaderDecode()
函数用于将http.Header解码回结构体
这个库非常适合需要将结构化数据转换为HTTP Header的场景,特别是在构建HTTP客户端或服务时,可以大大简化header的处理工作。
更多关于golang将结构体编码为HTTP Header字段插件库go-httpheader的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang将结构体编码为HTTP Header字段插件库go-httpheader的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-httpheader 库使用指南
go-httpheader 是一个用于将 Go 结构体编码为 HTTP Header 的库,它提供了一种简单的方式来将结构体字段映射到 HTTP 头部字段。
基本用法
首先安装库:
go get github.com/denisbrodbeck/go-httpheader
简单示例
package main
import (
"fmt"
"net/http"
"github.com/denisbrodbeck/go-httpheader"
)
type Headers struct {
ContentType string `header:"Content-Type"`
Authorization string
CustomHeader string `header:"X-Custom-Header"`
}
func main() {
h := Headers{
ContentType: "application/json",
Authorization: "Bearer abc123",
CustomHeader: "custom-value",
}
header := http.Header{}
err := httpheader.Encode(&h, &header)
if err != nil {
panic(err)
}
fmt.Println("Content-Type:", header.Get("Content-Type"))
fmt.Println("Authorization:", header.Get("Authorization"))
fmt.Println("X-Custom-Header:", header.Get("X-Custom-Header"))
}
特性说明
- 自动命名转换:未指定
header
tag 的字段会自动转换为连字符格式(如UserAgent
→User-Agent
) - 支持多种类型:字符串、切片、指针、嵌套结构体等
- 忽略字段:使用
header:"-"
忽略字段
嵌套结构体示例
type Auth struct {
Token string `header:"Authorization"`
}
type RequestHeaders struct {
ContentType string `header:"Content-Type"`
Auth // 嵌套结构体
CacheControl string
}
func main() {
h := RequestHeaders{
ContentType: "text/html",
Auth: Auth{
Token: "Bearer xyz789",
},
CacheControl: "no-cache",
}
header := http.Header{}
err := httpheader.Encode(&h, &header)
if err != nil {
panic(err)
}
fmt.Println("Content-Type:", header.Get("Content-Type"))
fmt.Println("Authorization:", header.Get("Authorization"))
fmt.Println("Cache-Control:", header.Get("Cache-Control"))
}
切片和指针示例
type Headers struct {
Accept []string
XForwarded *string `header:"X-Forwarded-For"`
IgnoreField string `header:"-"`
}
func main() {
forwarded := "192.168.1.1"
h := Headers{
Accept: []string{"text/html", "application/xml"},
XForwarded: &forwarded,
}
header := http.Header{}
err := httpheader.Encode(&h, &header)
if err != nil {
panic(err)
}
fmt.Println("Accept:", header["Accept"])
fmt.Println("X-Forwarded-For:", header.Get("X-Forwarded-For"))
}
实际应用场景
创建 HTTP 请求
func createRequest() (*http.Request, error) {
type RequestHeaders struct {
UserAgent string `header:"User-Agent"`
ContentType string `header:"Content-Type"`
Accept []string
}
headers := RequestHeaders{
UserAgent: "MyApp/1.0",
ContentType: "application/json",
Accept: []string{"application/json", "text/xml"},
}
req, err := http.NewRequest("GET", "https://api.example.com", nil)
if err != nil {
return nil, err
}
if err := httpheader.Encode(&headers, &req.Header); err != nil {
return nil, err
}
return req, nil
}
注意事项
- 结构体字段必须是可导出的(首字母大写)
- 默认情况下字段名会转换为连字符格式,除非指定了
header
tag - 支持的类型包括:string、[]string、bool、int、float 等基本类型及其指针
- 嵌套结构体会被展开,字段名会合并
go-httpheader 提供了一种声明式的方式来处理 HTTP 头部,使代码更加清晰和易于维护。