增加通过反射复制逻辑

This commit is contained in:
白茶清欢 2023-02-02 15:11:30 +08:00
parent c8d3a6688f
commit ea3f8df7d1

View File

@ -337,7 +337,10 @@ func (rv *ReflectValue) fillFieldValue(reflectValue reflect.Value, fieldInfo *St
responseByte, _ := json.Marshal(preSendHandler.GetResponseData()) responseByte, _ := json.Marshal(preSendHandler.GetResponseData())
extensionByte, _ := json.Marshal(preSendHandler.GetExtensionData()) extensionByte, _ := json.Marshal(preSendHandler.GetExtensionData())
for _, item := range fieldInfo.MappingRuleList { for _, item := range fieldInfo.MappingRuleList {
if rv.setDataValue(reflectValue, fieldInfo, item, header, paramByte, responseByte, extensionByte) {
// 找到数据,并且赋值成功,结束继续查找
break
}
} }
} }
@ -347,20 +350,59 @@ func (rv *ReflectValue) fillFieldValue(reflectValue reflect.Value, fieldInfo *St
// //
// Date : 14:24 2023/2/2 // Date : 14:24 2023/2/2
func (rv *ReflectValue) setDataValue(reflectVal reflect.Value, fieldInfo *StructField, rule MappingRuleItem, header http.Header, paramByte, responseByte, extensionByte []byte) bool { func (rv *ReflectValue) setDataValue(reflectVal reflect.Value, fieldInfo *StructField, rule MappingRuleItem, header http.Header, paramByte, responseByte, extensionByte []byte) bool {
switch rule.Location { inputVal := rv.getInputValue(rule, header, paramByte, responseByte, extensionByte)
case MappingLocationHeader: if len(inputVal) == 0 {
str := header.Get(rule.Field)
if len(str) == 0 {
// 未进行值设置
return false return false
} }
case MappingLocationParam: switch fieldInfo.Type {
case MappingLocationResponse: case reflect.String:
case MappingLocationExtension: reflectVal.Field(fieldInfo.Idx).SetString(inputVal)
return true
case reflect.Int64:
var i int64
if err := util.ConvertAssign(&i, inputVal); nil != err {
return false
}
if i == 0 {
return false
}
if fieldInfo.IsPtr {
reflectVal.Field(fieldInfo.Idx).Set(reflect.ValueOf(&i))
} else {
reflectVal.Field(fieldInfo.Idx).SetInt(i)
}
return true
case reflect.Float64:
var f float64
if err := util.ConvertAssign(&f, inputVal); nil != err {
return false
}
if f == 0 {
return false
}
if fieldInfo.IsPtr {
reflectVal.Field(fieldInfo.Idx).Set(reflect.ValueOf(&f))
} else {
reflectVal.Field(fieldInfo.Idx).SetFloat(f)
}
return true
case reflect.Interface:
reflectVal.Field(fieldInfo.Idx).Set(reflect.ValueOf(&inputVal))
return true
case reflect.Slice:
fallthrough
case reflect.Map:
fallthrough
case reflect.Struct:
var v interface{}
if err := json.Unmarshal([]byte(inputVal), &v); nil != err {
return false
}
reflectVal.Field(fieldInfo.Idx).Set(reflect.ValueOf(&v))
return true
default: default:
return false return false
} }
return true
} }
// getInputValue 获取输入的值 // getInputValue 获取输入的值