背景:
在做对php服务重构的时候,看到php中curl对post用到了http_build_query函数封装感觉很好用,可以传递参数为数组类型,开始未考虑参数为数组类型转换方式,导致获取参数有误,后来修改后无误,网上找的都比较简单,无法支持数组类型,所以稍微改进了一下。
说明:
以下是用go语言实现的php中http_build_query函数的代码:
package httpext
import (
"fmt"
"github.com/gogf/gf/util/gconv"
"strings"
)
func HttpBuildQuery(params map[string]interface{}, parentKey string) (param_str string) {
//fmt.Println("parentKey ", parentKey)
params_arr := make([]string, 0)
for k, v := range params {
if vals, ok := v.(map[string]interface{}); ok {
if parentKey != "" {
k = fmt.Sprintf("%s[%s]", parentKey, k)
}
params_arr = append(params_arr, HttpBuildQuery(vals, k))
} else {
if parentKey != "" {
params_arr = append(params_arr, fmt.Sprintf("%s[%s]=%s", parentKey, k, gconv.String(v)))
} else {
params_arr = append(params_arr, fmt.Sprintf("%s=%s", k, gconv.String(v)))
}
}
}
param_str = strings.Join(params_arr, "&")
return param_str
}
文件路径 httpext/build_query.go
package httpext
import (
"github.com/imroc/req"
"testing"
"time"
)
func TestHttpBuildQuery(t *testing.T) {
m := make(map[string]interface{})
m["msgCode"] = 22
m["to_uid"] = 111111
m["msgParams"] = map[string]interface{}{
"nickName": "土豆哪里挖",
"workName": "作品",
"modifyReason": "呃呃呃",
}
m["data"] = map[string]interface{}{
"userInfo": map[string]interface{}{
"userId": 11111,
"age": 20,
"city": "北京",
"login": map[string]interface{}{
"token": "aaaaaaaaa",
"deviceId": "bbbbbbbb",
"lastLoginTime": time.Now().Unix(),
},
},
"sign": "123456787654321",
}
m["time"] = time.Now().Unix()
res := HttpBuildQuery(m, "")
t.Log(res)
}
文件路径 httpext/build_query_test.go