github.com/gogf/gf@v1.16.9/net/ghttp/ghttp_request_param_query.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  package ghttp
     8  
     9  import (
    10  	"github.com/gogf/gf/container/gvar"
    11  
    12  	"github.com/gogf/gf/util/gconv"
    13  )
    14  
    15  // SetQuery sets custom query value with key-value pair.
    16  func (r *Request) SetQuery(key string, value interface{}) {
    17  	r.parseQuery()
    18  	if r.queryMap == nil {
    19  		r.queryMap = make(map[string]interface{})
    20  	}
    21  	r.queryMap[key] = value
    22  }
    23  
    24  // GetQuery retrieves and returns parameter with given name <key> from query string
    25  // and request body. It returns <def> if <key> does not exist in the query and <def> is given,
    26  // or else it returns nil.
    27  //
    28  // Note that if there're multiple parameters with the same name, the parameters are retrieved
    29  // and overwrote in order of priority: query > body.
    30  func (r *Request) GetQuery(key string, def ...interface{}) interface{} {
    31  	r.parseQuery()
    32  	if len(r.queryMap) > 0 {
    33  		if v, ok := r.queryMap[key]; ok {
    34  			return v
    35  		}
    36  	}
    37  	if r.Method == "GET" {
    38  		r.parseBody()
    39  	}
    40  	if len(r.bodyMap) > 0 {
    41  		if v, ok := r.bodyMap[key]; ok {
    42  			return v
    43  		}
    44  	}
    45  	if len(def) > 0 {
    46  		return def[0]
    47  	}
    48  	return nil
    49  }
    50  
    51  func (r *Request) GetQueryVar(key string, def ...interface{}) *gvar.Var {
    52  	return gvar.New(r.GetQuery(key, def...))
    53  }
    54  
    55  func (r *Request) GetQueryString(key string, def ...interface{}) string {
    56  	return r.GetQueryVar(key, def...).String()
    57  }
    58  
    59  func (r *Request) GetQueryBool(key string, def ...interface{}) bool {
    60  	return r.GetQueryVar(key, def...).Bool()
    61  }
    62  
    63  func (r *Request) GetQueryInt(key string, def ...interface{}) int {
    64  	return r.GetQueryVar(key, def...).Int()
    65  }
    66  
    67  func (r *Request) GetQueryInt32(key string, def ...interface{}) int32 {
    68  	return r.GetQueryVar(key, def...).Int32()
    69  }
    70  
    71  func (r *Request) GetQueryInt64(key string, def ...interface{}) int64 {
    72  	return r.GetQueryVar(key, def...).Int64()
    73  }
    74  
    75  func (r *Request) GetQueryInts(key string, def ...interface{}) []int {
    76  	return r.GetQueryVar(key, def...).Ints()
    77  }
    78  
    79  func (r *Request) GetQueryUint(key string, def ...interface{}) uint {
    80  	return r.GetQueryVar(key, def...).Uint()
    81  }
    82  
    83  func (r *Request) GetQueryUint32(key string, def ...interface{}) uint32 {
    84  	return r.GetQueryVar(key, def...).Uint32()
    85  }
    86  
    87  func (r *Request) GetQueryUint64(key string, def ...interface{}) uint64 {
    88  	return r.GetQueryVar(key, def...).Uint64()
    89  }
    90  
    91  func (r *Request) GetQueryFloat32(key string, def ...interface{}) float32 {
    92  	return r.GetQueryVar(key, def...).Float32()
    93  }
    94  
    95  func (r *Request) GetQueryFloat64(key string, def ...interface{}) float64 {
    96  	return r.GetQueryVar(key, def...).Float64()
    97  }
    98  
    99  func (r *Request) GetQueryFloats(key string, def ...interface{}) []float64 {
   100  	return r.GetQueryVar(key, def...).Floats()
   101  }
   102  
   103  func (r *Request) GetQueryArray(key string, def ...interface{}) []string {
   104  	return r.GetQueryVar(key, def...).Strings()
   105  }
   106  
   107  func (r *Request) GetQueryStrings(key string, def ...interface{}) []string {
   108  	return r.GetQueryVar(key, def...).Strings()
   109  }
   110  
   111  func (r *Request) GetQueryInterfaces(key string, def ...interface{}) []interface{} {
   112  	return r.GetQueryVar(key, def...).Interfaces()
   113  }
   114  
   115  // GetQueryMap retrieves and returns all parameters passed from client using HTTP GET method
   116  // as map. The parameter <kvMap> specifies the keys retrieving from client parameters,
   117  // the associated values are the default values if the client does not pass.
   118  //
   119  // Note that if there're multiple parameters with the same name, the parameters are retrieved and overwrote
   120  // in order of priority: query > body.
   121  func (r *Request) GetQueryMap(kvMap ...map[string]interface{}) map[string]interface{} {
   122  	r.parseQuery()
   123  	if r.Method == "GET" {
   124  		r.parseBody()
   125  	}
   126  	var m map[string]interface{}
   127  	if len(kvMap) > 0 && kvMap[0] != nil {
   128  		if len(r.queryMap) == 0 && len(r.bodyMap) == 0 {
   129  			return kvMap[0]
   130  		}
   131  		m = make(map[string]interface{}, len(kvMap[0]))
   132  		if len(r.bodyMap) > 0 {
   133  			for k, v := range kvMap[0] {
   134  				if postValue, ok := r.bodyMap[k]; ok {
   135  					m[k] = postValue
   136  				} else {
   137  					m[k] = v
   138  				}
   139  			}
   140  		}
   141  		if len(r.queryMap) > 0 {
   142  			for k, v := range kvMap[0] {
   143  				if postValue, ok := r.queryMap[k]; ok {
   144  					m[k] = postValue
   145  				} else {
   146  					m[k] = v
   147  				}
   148  			}
   149  		}
   150  	} else {
   151  		m = make(map[string]interface{}, len(r.queryMap)+len(r.bodyMap))
   152  		for k, v := range r.bodyMap {
   153  			m[k] = v
   154  		}
   155  		for k, v := range r.queryMap {
   156  			m[k] = v
   157  		}
   158  	}
   159  	return m
   160  }
   161  
   162  // GetQueryMapStrStr retrieves and returns all parameters passed from client using HTTP GET method
   163  // as map[string]string. The parameter <kvMap> specifies the keys
   164  // retrieving from client parameters, the associated values are the default values if the client
   165  // does not pass.
   166  func (r *Request) GetQueryMapStrStr(kvMap ...map[string]interface{}) map[string]string {
   167  	queryMap := r.GetQueryMap(kvMap...)
   168  	if len(queryMap) > 0 {
   169  		m := make(map[string]string, len(queryMap))
   170  		for k, v := range queryMap {
   171  			m[k] = gconv.String(v)
   172  		}
   173  		return m
   174  	}
   175  	return nil
   176  }
   177  
   178  // GetQueryMapStrVar retrieves and returns all parameters passed from client using HTTP GET method
   179  // as map[string]*gvar.Var. The parameter <kvMap> specifies the keys
   180  // retrieving from client parameters, the associated values are the default values if the client
   181  // does not pass.
   182  func (r *Request) GetQueryMapStrVar(kvMap ...map[string]interface{}) map[string]*gvar.Var {
   183  	queryMap := r.GetQueryMap(kvMap...)
   184  	if len(queryMap) > 0 {
   185  		m := make(map[string]*gvar.Var, len(queryMap))
   186  		for k, v := range queryMap {
   187  			m[k] = gvar.New(v)
   188  		}
   189  		return m
   190  	}
   191  	return nil
   192  }
   193  
   194  // GetQueryStruct retrieves all parameters passed from client using HTTP GET method
   195  // and converts them to given struct object. Note that the parameter <pointer> is a pointer
   196  // to the struct object. The optional parameter <mapping> is used to specify the key to
   197  // attribute mapping.
   198  func (r *Request) GetQueryStruct(pointer interface{}, mapping ...map[string]string) error {
   199  	_, err := r.doGetQueryStruct(pointer, mapping...)
   200  	return err
   201  }
   202  
   203  func (r *Request) doGetQueryStruct(pointer interface{}, mapping ...map[string]string) (data map[string]interface{}, err error) {
   204  	r.parseQuery()
   205  	data = r.GetQueryMap()
   206  	if data == nil {
   207  		data = map[string]interface{}{}
   208  	}
   209  	if err := r.mergeDefaultStructValue(data, pointer); err != nil {
   210  		return data, nil
   211  	}
   212  	return data, gconv.Struct(data, pointer, mapping...)
   213  }