mirror of
https://gitee.com/johng/gf
synced 2026-06-06 02:25:47 +08:00
fix(net/ghttp):check parameter existence to determine using default or front-end value. (#4182)
This commit is contained in:
@ -8,7 +8,6 @@ package ghttp
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/v2/container/gvar"
|
||||
"github.com/gogf/gf/v2/internal/empty"
|
||||
"github.com/gogf/gf/v2/net/goai"
|
||||
"github.com/gogf/gf/v2/os/gstructs"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
@ -178,15 +177,17 @@ func (r *Request) doGetRequestStruct(pointer interface{}, mapping ...map[string]
|
||||
if data == nil {
|
||||
data = map[string]interface{}{}
|
||||
}
|
||||
// Default struct values.
|
||||
if err = r.mergeDefaultStructValue(data, pointer); err != nil {
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// `in` Tag Struct values.
|
||||
if err = r.mergeInTagStructValue(data); err != nil {
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// Default struct values.
|
||||
if err = r.mergeDefaultStructValue(data, pointer); err != nil {
|
||||
return data, nil
|
||||
}
|
||||
|
||||
return data, gconv.Struct(data, pointer, mapping...)
|
||||
}
|
||||
|
||||
@ -194,20 +195,9 @@ func (r *Request) doGetRequestStruct(pointer interface{}, mapping ...map[string]
|
||||
func (r *Request) mergeDefaultStructValue(data map[string]interface{}, pointer interface{}) error {
|
||||
fields := r.serveHandler.Handler.Info.ReqStructFields
|
||||
if len(fields) > 0 {
|
||||
var (
|
||||
foundKey string
|
||||
foundValue interface{}
|
||||
)
|
||||
for _, field := range fields {
|
||||
if tagValue := field.TagDefault(); tagValue != "" {
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(data, field.Name())
|
||||
if foundKey == "" {
|
||||
data[field.Name()] = tagValue
|
||||
} else {
|
||||
if empty.IsEmpty(foundValue) {
|
||||
data[foundKey] = tagValue
|
||||
}
|
||||
}
|
||||
mergeTagValueWithFoundKey(data, false, field.Name(), field.Name(), tagValue)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@ -219,19 +209,8 @@ func (r *Request) mergeDefaultStructValue(data map[string]interface{}, pointer i
|
||||
return err
|
||||
}
|
||||
if len(tagFields) > 0 {
|
||||
var (
|
||||
foundKey string
|
||||
foundValue interface{}
|
||||
)
|
||||
for _, field := range tagFields {
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(data, field.Name())
|
||||
if foundKey == "" {
|
||||
data[field.Name()] = field.TagValue
|
||||
} else {
|
||||
if empty.IsEmpty(foundValue) {
|
||||
data[foundKey] = field.TagValue
|
||||
}
|
||||
}
|
||||
mergeTagValueWithFoundKey(data, false, field.Name(), field.Name(), field.TagValue)
|
||||
}
|
||||
}
|
||||
|
||||
@ -261,34 +240,29 @@ func (r *Request) mergeInTagStructValue(data map[string]interface{}) error {
|
||||
|
||||
for _, field := range fields {
|
||||
if tagValue := field.TagIn(); tagValue != "" {
|
||||
findKey := field.TagPriorityName()
|
||||
switch tagValue {
|
||||
case goai.ParameterInHeader:
|
||||
foundHeaderKey, foundHeaderValue := gutil.MapPossibleItemByKey(headerMap, field.TagPriorityName())
|
||||
if foundHeaderKey != "" {
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(data, foundHeaderKey)
|
||||
if foundKey == "" {
|
||||
data[field.Name()] = foundHeaderValue
|
||||
} else {
|
||||
if empty.IsEmpty(foundValue) {
|
||||
data[foundKey] = foundHeaderValue
|
||||
}
|
||||
}
|
||||
}
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(headerMap, findKey)
|
||||
case goai.ParameterInCookie:
|
||||
foundCookieKey, foundCookieValue := gutil.MapPossibleItemByKey(cookieMap, field.TagPriorityName())
|
||||
if foundCookieKey != "" {
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(data, foundCookieKey)
|
||||
if foundKey == "" {
|
||||
data[field.Name()] = foundCookieValue
|
||||
} else {
|
||||
if empty.IsEmpty(foundValue) {
|
||||
data[foundKey] = foundCookieValue
|
||||
}
|
||||
}
|
||||
}
|
||||
foundKey, foundValue = gutil.MapPossibleItemByKey(cookieMap, findKey)
|
||||
}
|
||||
if foundKey != "" {
|
||||
mergeTagValueWithFoundKey(data, true, foundKey, field.Name(), foundValue)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// mergeTagValueWithFoundKey merges the request parameters when the key does not exist in the map or overwritten is true or the value is nil.
|
||||
func mergeTagValueWithFoundKey(data map[string]interface{}, overwritten bool, findKey string, fieldName string, tagValue interface{}) {
|
||||
if foundKey, foundValue := gutil.MapPossibleItemByKey(data, findKey); foundKey == "" {
|
||||
data[fieldName] = tagValue
|
||||
} else {
|
||||
if overwritten || foundValue == nil {
|
||||
data[foundKey] = tagValue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user