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)
}

功能说明

  1. 字段控制

    • 未导出的字段(小写开头)会被自动忽略
    • 使用header:"-"标记可以显式忽略字段
    • 使用omitempty选项可以在字段为空值时忽略
  2. 类型支持

    • 支持基本类型(自动转换为字符串)
    • 支持数组/切片类型
    • 支持直接使用http.Header类型
  3. 自定义header名称

    • 通过header:"自定义名称"标签可以指定header字段名
  4. 编解码双向支持

    • Header()函数用于将结构体编码为http.Header
    • Decode()函数用于将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"))
}

特性说明

  1. 自动命名转换:未指定 header tag 的字段会自动转换为连字符格式(如 UserAgentUser-Agent
  2. 支持多种类型:字符串、切片、指针、嵌套结构体等
  3. 忽略字段:使用 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
}

注意事项

  1. 结构体字段必须是可导出的(首字母大写)
  2. 默认情况下字段名会转换为连字符格式,除非指定了 header tag
  3. 支持的类型包括:string、[]string、bool、int、float 等基本类型及其指针
  4. 嵌套结构体会被展开,字段名会合并

go-httpheader 提供了一种声明式的方式来处理 HTTP 头部,使代码更加清晰和易于维护。

回到顶部