Gin中接受参数方法很多,不同类型的参数用不同的方法接口, 由于目前 前段请求参数问题, 使用Go完善了下接受参数方法, 支持接受 get postform json类型数据, 具体代码:
// 解析参数为map
func ParseRequestParam(c *gin.Context ) map[string]interface{} {
urlMap := getUrlParam( c);
fmt.Println( "UrlParam : ", urlMap )
// 获取请求体中的JSON数据
var jsonMap map[string]interface{}
c.ShouldBind( &jsonMap )
if c.Request.Method == "GET" && c.Request.Header.Get("Content-Type") == "application/json" {
getRawData, _ := c.GetRawData()
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(getRawData))
extJson := []byte(getRawData)
var ext interface{}
json.Unmarshal(extJson, &ext)
jsonMap = ext.(map[string]interface{})
Log("GET JSON DATA :", jsonMap)
}
// 获取PostForm参数
formData := getPostFormParam( c );
// 合并数据并返回
alLReqData := MapMerge(formData , urlMap , jsonMap)
return alLReqData
}
// 获取请求字符串
func MapMerge( maps ...map[string]interface{} ) map[string]interface{}{
if len(maps) == 0 {
return nil
}
allMap := make(map[string]interface{},0)
for _, v := range maps {
if len(allMap) == 0 {
allMap = v
}else{
if len(v) > 0 {
for mk, mv := range v {
allMap[mk] = mv
}
}
}
}
return allMap
}
// 获取请求字符串
func getPostFormParam(c *gin.Context) map[string]interface{}{
var formMap = make(map[string]interface{},0)
for k, v := range c.Request.PostForm {
formMap[k] = arrayToString(v)
}
return formMap;
}
// 获取请求字符串
func getUrlParam(c *gin.Context) map[string]interface{}{
route := c.FullPath()
fullPath := fmt.Sprintf("%v",c.Request.URL)
// 路由和路径相同返回空
if route == fullPath {
return nil
}
// 拼接一个? 解析出URL参数
if strings.LastIndex(route , "?" ) < 0 {
route += "?"
}
replace := strings.Replace(fullPath, route, "", 1 )
urlParam,_:= url.ParseQuery(replace)
// 解析参数为map格式
var urlMap = make(map[string]interface{},0)
for k,v := range urlParam{
urlMap[k] = arrayToString(v)
}
return urlMap
}
// 数组类型slice转换为 string
func arrayToString(arr []string) string {
var result string
for _, i := range arr { //遍历数组中所有元素追加成string
result += i
}
return result
}
自己简单测试了下 ,有问题继续改进