我就廢話不多說了,大家還是直接看代碼吧~
package main import ( "fmt" "net/url" ) // Manage the HTTP GET request parameters type GetRequest struct { urls url.Values } // Initializer func (p *GetRequest) Init() *GetRequest { p.urls = url.Values{} return p } // Initialized from another instance func (p *GetRequest) InitFrom(reqParams *GetRequest) *GetRequest { if reqParams != nil { p.urls = reqParams.urls } else { p.urls = url.Values{} } return p } // Add URL escape property and value pair func (p *GetRequest) AddParam(property string, value string) *GetRequest { if property != "" value != "" { p.urls.Add(property, value) } return p } // Concat the property and value pair func (p *GetRequest) BuildParams() string { return p.urls.Encode() } func main() { init := new(GetRequest).Init() params := init.AddParam("market", "sh").AddParam("Inst","6000987").BuildParams() //params := init.AddParam("market", "sh") fmt.Println(params) }
結果:
Inst=6000987market=sh
補充: golang常見字符串拼接通用處理方式
我們在日常開發(fā)中,尤其是對接第三方登錄、支付、分享等功能時,時常需要對自己或接收到的數(shù)據(jù)進行一定的排序拼接后, 然后進行或加密或校驗的處理,雖然寫死順序可以解決問題,但代碼缺少了靈活性。
本文從通用性角度,以golang語言來處理一般情況下的字符串拼接問題。
目前已開發(fā)成專門的拼接工具go-join,歡迎使用并提出意見。
目前經(jīng)常遇到的排序方式主要有以下兩種:
1、參數(shù)名ASCII碼從小到大排序
以下是微信開發(fā)者平臺的簽名要求:
簽名生成的通用步驟如下:
第一步,設所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對的格式(即key1=value1key2=value2…)拼接成字符串stringA。
特別注意以下重要規(guī)則:
◆ 參數(shù)名ASCII碼從小到大排序(字典序);
◆ 如果參數(shù)的值為空不參與簽名;
◆ 參數(shù)名區(qū)分大小寫;
◆ 驗證調(diào)用返回或微信主動通知簽名時,傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗。
◆ 微信接口可能增加字段,驗證簽名時必須支持增加的擴展字段
//JoinStringsInASCII 按照規(guī)則,參數(shù)名ASCII碼從小到大排序后拼接 //data 待拼接的數(shù)據(jù) //sep 連接符 //onlyValues 是否只包含參數(shù)值,true則不包含參數(shù)名,否則參數(shù)名和參數(shù)值均有 //includeEmpty 是否包含空值,true則包含空值,否則不包含,注意此參數(shù)不影響參數(shù)名的存在 //exceptKeys 被排除的參數(shù)名,不參與排序及拼接 func JoinStringsInASCII(data map[string]string, sep string, onlyValues, includeEmpty bool, exceptKeys ...string) string { var list []string var keyList []string m := make(map[string]int) if len(exceptKeys) > 0 { for _, except := range exceptKeys { m[except] = 1 } } for k := range data { if _, ok := m[k]; ok { continue } value := data[k] if !includeEmpty value == "" { continue } if onlyValues { keyList = append(keyList, k) } else { list = append(list, fmt.Sprintf("%s=%s", k, value)) } } if onlyValues { sort.Strings(keyList) for _,v := range keyList { list = append(list,data[v]) } }else { sort.Strings(list) } return strings.Join(list, sep) }
示例:
data := make(map[string]string) data["appid"] = "wx_1234535" data["body"] = "test data" data["mch_id"] = "572836589" data["notify_url"] = "http://www.baidu.com" data["trade_type"] = "MWEB" data["spbill_create_ip"] = "192.169.0.1" data["total_fee"] = "100" data["out_trade_no"] = "2745890486870" data["nonce_str"] = "kdjskgjokghdk" data["sign"] = "signData" log.Println("str :", JoinStringsInASCII(data, "", false, false, "sign")) log.Println("str2 :", JoinStringsInASCII(data, "", true, false, "sign"))
示例結果:
str : appid=wx_1234535body=test datamch_id=572836589nonce_str=kdjskgjokghdknotify_url=http://www.baidu.comout_trade_no=2745890486870spbill_create_ip=192.169.0.1total_fee=100trade_type=MWEB str2 : wx_1234535test data572836589kdjskgjokghdkhttp://www.baidu.com2745890486870192.169.0.1100MWEB
2.按照特定的參數(shù)順序拼接
//JoinStringsInOrder 數(shù)名按固定順序排列后拼接 //data 待拼接的數(shù)據(jù) //sep 連接符 //onlyValues 是否只包含參數(shù)值,true則不包含參數(shù)名,否則參數(shù)名和參數(shù)值均有 //orders 按照順序的參數(shù)名,沒有的不參與拼接 func JoinStringsInOrder(data map[string]string, sep string,onlyValues bool, orders ...string) string { var list []string for _, key := range orders { if _,ok := data[key];!ok { continue } if onlyValues { list = append(list, data[key]) }else { list = append(list, fmt.Sprintf("%s=%s", key, data[key])) } } return strings.Join(list, sep) }
示例:
log.Println("str3 :", JoinStringsInOrder(data, "", false, "appid","body","mch_id","notify_url"))
log.Println("str4 :", JoinStringsInOrder(data, "", true, "appid","body","mch_id","notify_url"))
示例結果:
str3 : appid=wx_1234535body=test datamch_id=572836589notify_url=http://www.baidu.com
str4 : wx_1234535test data572836589http://www.baidu.com
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
標簽:安康 遼寧 青海 儋州 海南 西雙版納 物業(yè)服務 電子產(chǎn)品
巨人網(wǎng)絡通訊聲明:本文標題《golang語言http協(xié)議get拼接參數(shù)操作》,本文關鍵詞 golang,語言,http,協(xié)議,get,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。