urlparam provides url.Value to Struct and Struct to url.Value, and support protobuf struct.

  • By YangShuai
  • Last update: Oct 11, 2022
  • Comments: 0

urlparam provides url.Value to Struct and Struct to url.Value, and support protobuf struct.

urlparam 快速将url参数和struct直接相互转换

urlparam 提供url参数自动解析到结构体,实现url.Value to Struct和 Struct to url.Value 支持结构体标签,利用结构体的反射标签可以自定义参数名称的映射关系, 默认利用json标签,可以使此库可直接用pb.go生成的结构体,便于不同服务之间使用pb管理url params 的协议 支持修改标签类型,解析标签名可修改导出变量URLParamTag来改变 没有定义标签则默认使用结构体的字段名称作为url参数名称,并且 - 标签作为不解析标记,和json标签语法兼容

使用示例

以UserReportParams作为示例

	// UserReportParams 作为示例
	type UserReportParams struct {
	BusiType   int32  `json:"busi_type,omitempty"` // 同一个标签里面有option参数,例如PB生成的结构
	Uid        string `json:"uid"`                 // 一个字段一个标签 string类型
	AdposType  int32  `json:"adpos_type"`
	ActionType int32  // 无标签
	FeedsIndex uint32 `json:"feeds_index"` // uint32 类型
	AdposId    string `json:"-"`           // 屏蔽标签
	}

结构体转为url参数

	// 结构体转为URL参数
	userData := &UserReportParams{
		BusiType:   1,
		Uid:        "2222",
		AdposType:  555,
		ActionType: -666,
		FeedsIndex: 7777,
		AdposId:    "aaaaa",
	}
	values, errs := urlparam.Encode(userData)
	if errs != nil {
		fmt.Printf("errors %v", errs)
		return
	}
	fmt.Printf("%v\n", values.Encode())

输出结果

ActionType=-666&adpos_type=555&busi_type=1&feeds_index=7777&uid=2222

可以看到结构体值被序列化成了url参数 1.AdposType没有定义标签,则使用字段名作为参数名 2.AdposId 写了屏蔽标签,即使有值也会被编码到url参数里

url参数转为结构体

	// url参数解析到结构体
	urlStr := "AdposId=aaaa&ActionType=-666&adpos_type=555&busi_type=1&feeds_index=7777&uid=2222"
	values, _ := url.ParseQuery(urlStr)
	res := UserReportParams{}
	err := urlparam.Decode(values, &res)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Printf("%+v\n", res)

输出结果:

{BusiType:1 Uid:2222 AdposType:555 ActionType:-666 FeedsIndex:7777 AdposId:}

可以看到按结构体标签对应的url 参数被解析到结构体中,AdposId 写了屏蔽标签,即使有值也不会被解析

Download

urlparam.zip