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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。