golang语言http协议get拼接参数操作
我就废话不多说了,大家还是直接看代码吧~
packagemain import( "fmt" "net/url" ) //ManagetheHTTPGETrequestparameters typeGetRequeststruct{ urlsurl.Values } //Initializer func(p*GetRequest)Init()*GetRequest{ p.urls=url.Values{} returnp } //Initializedfromanotherinstance func(p*GetRequest)InitFrom(reqParams*GetRequest)*GetRequest{ ifreqParams!=nil{ p.urls=reqParams.urls }else{ p.urls=url.Values{} } returnp } //AddURLescapepropertyandvaluepair func(p*GetRequest)AddParam(propertystring,valuestring)*GetRequest{ ifproperty!=""&&value!=""{ p.urls.Add(property,value) } returnp } //Concatthepropertyandvaluepair func(p*GetRequest)BuildParams()string{ returnp.urls.Encode() } funcmain(){ init:=new(GetRequest).Init() params:=init.AddParam("market","sh").AddParam("Inst","6000987").BuildParams() //params:=init.AddParam("market","sh") fmt.Println(params) }
结果:
Inst=6000987&market=sh
补充:golang常见字符串拼接通用处理方式
前言
我们在日常开发中,尤其是对接第三方登录、支付、分享等功能时,时常需要对自己或接收到的数据进行一定的排序拼接后,然后进行或加密或校验的处理,虽然写死顺序可以解决问题,但代码缺少了灵活性。
本文从通用性角度,以golang语言来处理一般情况下的字符串拼接问题。
目前已开发成专门的拼接工具go-join,欢迎使用并提出意见。
拼接处理
目前经常遇到的排序方式主要有以下两种:
1、参数名ASCII码从小到大排序
以下是微信开发者平台的签名要求:
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特别注意以下重要规则:
◆参数名ASCII码从小到大排序(字典序);
◆如果参数的值为空不参与签名;
◆参数名区分大小写;
◆验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
◆微信接口可能增加字段,验证签名时必须支持增加的扩展字段
//JoinStringsInASCII按照规则,参数名ASCII码从小到大排序后拼接 //data待拼接的数据 //sep连接符 //onlyValues是否只包含参数值,true则不包含参数名,否则参数名和参数值均有 //includeEmpty是否包含空值,true则包含空值,否则不包含,注意此参数不影响参数名的存在 //exceptKeys被排除的参数名,不参与排序及拼接 funcJoinStringsInASCII(datamap[string]string,sepstring,onlyValues,includeEmptybool,exceptKeys...string)string{ varlist[]string varkeyList[]string m:=make(map[string]int) iflen(exceptKeys)>0{ for_,except:=rangeexceptKeys{ m[except]=1 } } fork:=rangedata{ if_,ok:=m[k];ok{ continue } value:=data[k] if!includeEmpty&&value==""{ continue } ifonlyValues{ keyList=append(keyList,k) }else{ list=append(list,fmt.Sprintf("%s=%s",k,value)) } } ifonlyValues{ sort.Strings(keyList) for_,v:=rangekeyList{ list=append(list,data[v]) } }else{ sort.Strings(list) } returnstrings.Join(list,sep) }
示例:
data:=make(map[string]string) data["appid"]="wx_1234535" data["body"]="testdata" 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_1234535&body=testdata&mch_id=572836589&nonce_str=kdjskgjokghdk¬ify_url=http://www.baidu.com&out_trade_no=2745890486870&spbill_create_ip=192.169.0.1&total_fee=100&trade_type=MWEB str2:wx_1234535&testdata&572836589&kdjskgjokghdk&http://www.baidu.com&2745890486870&192.169.0.1&100&MWEB
2.按照特定的参数顺序拼接
//JoinStringsInOrder数名按固定顺序排列后拼接 //data待拼接的数据 //sep连接符 //onlyValues是否只包含参数值,true则不包含参数名,否则参数名和参数值均有 //orders按照顺序的参数名,没有的不参与拼接 funcJoinStringsInOrder(datamap[string]string,sepstring,onlyValuesbool,orders...string)string{ varlist[]string for_,key:=rangeorders{ if_,ok:=data[key];!ok{ continue } ifonlyValues{ list=append(list,data[key]) }else{ list=append(list,fmt.Sprintf("%s=%s",key,data[key])) } } returnstrings.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_1234535&body=testdata&mch_id=572836589¬ify_url=http://www.baidu.com
str4:wx_1234535&testdata&572836589&http://www.baidu.com
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。