当前位置: 首页 > news >正文

go使用反射获取http.Request参数到结构体 - 实践

1. 为什么写这个工具

公司代码使用go原生写的,没有使用框架,接收前端的代码都使用的是req.FormValue()来接收,我觉得写了太多的接收参数的重复代码

2. Go代码
// ParseParams 解析前端传的参数到结构体
func ParseParams[T any](req *http.Request) (T, error) {
var t T
tType := reflect.TypeOf(t)
tValue := reflect.ValueOf(&t).Elem()
if tType.Kind() != reflect.Struct {
return t, fmt.Errorf("parseParams err: tType.Kind() != reflect.Struct")
}
for i := 0; i < tType.NumField(); i++ {
field := tType.Field(i)
value := tValue.Field(i)
err := setFieldValue(field, value, req)
if err != nil {
return t, err
}
}
return t, nil
}
// 设置对应的字段值
// 仅支持string, int, int64, int32, slice
func setFieldValue(field reflect.StructField, value reflect.Value, req *http.Request) error {
formValue := req.FormValue(field.Tag.Get("json"))
switch field.Type.Kind() {
case reflect.String:
value.SetString(formValue)
case reflect.Int, reflect.Int64, reflect.Int32:
atoi, err := strconv.Atoi(formValue)
if err != nil {
return fmt.Errorf("setFieldValue err: strconv.Atoi(%s) err: %v, field.Name: %v", formValue, err, field.Name)
}
value.SetInt(int64(atoi))
case reflect.Slice:
newSlice := reflect.New(field.Type)
if err := json.Unmarshal([]byte(formValue), newSlice.Interface()); err != nil {
return fmt.Errorf("setFieldValue err: json.Unmarshal(%s) err: %v, field.Name: %v", formValue, err, field.Name)
}
value.Set(newSlice.Elem())
default:
return fmt.Errorf("setFieldValue err: field.Type.Kind() not support: %v, field.Name: %v", field.Type.Kind(), field.Name)
}
return nil
}
3.使用
type TestReq struct {
ID int32 `json:"id"`
Name string `json:"name"`
SiteIdList []int32 `json:"siteIdList"`
DateTimeList []int64 `json:"dateTimeList"`
}
func TestParseParams(t *testing.T) {
req := &http.Request{
}
req.Form = map[string][]string{
"id": {
"1"
},
"name": {
"test"
},
"siteIdList": {
"[1,2,3]"
},
"dateTimeList": {
"[1694560000, 1694560060]"
},
}
params, err := ParseParams[TestReq](req)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(params)
}
目前只做了我常用的一些变量,后续可能会加入其他变量和字段校验
http://www.wxhsa.cn/company.asp?id=5629

相关文章:

  • 基于MATLAB/Simulink的TI2000系列DSP模型设计
  • 挖矿木马病毒清理手册
  • nginx 常用参数
  • Python常见函数和代码示例
  • Java开发电脑开荒软件
  • 69-SQLite应用 - 详解
  • mysql 源码下载,从获取到安装的完整指南
  • docker中centos7配置
  • centos7虚拟机下系统环境配置
  • CefSharp高版本问题
  • 前缀和pre,如何求总和:pre(r) - pre(l)(1 = l = r = n),以及|pre(r) - pre(l)|
  • P11537 [NOISG 2023 Finals] Toxic Gene 题解
  • keil5中stm32相关记录
  • centos7中mysql环境配置
  • centos7中php环境配置
  • Symfony学习笔记 - 利用Doctrine开发一个学生信息的增删查改
  • 函数计算进化之路:AI Sandbox 新基座
  • linux通过smb共享文件夹,windows进行连接
  • 强制Apache Web服务器始终使用https
  • 初始vue3
  • 如何在Nginx服务器配置https以及强制跳转https
  • centos7中安装protobuf-c
  • 赞助NYU-Poly女性网络安全研讨会:推动行业多元发展
  • MyEMS:开源能源管理的探索与实践
  • 实时内核中的调度程序节流
  • 配置Burp Suite与Proxifier抓取微信小程序流量
  • 我的ai 相关工具站
  • C#第十一章 023 024
  • MyEMS:赋能每一个组织,成为自己的能源管理专家
  • Vue开发微信公众号上传图片