golang語言http協(xié)議get拼接參數(shù)操作
我就廢話不多說了,大家還是直接看代碼吧~
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)
}
結(jié)果:
Inst=6000987&market=sh
補(bǔ)充: golang常見字符串拼接通用處理方式
前言
我們?cè)谌粘i_發(fā)中,尤其是對(duì)接第三方登錄、支付、分享等功能時(shí),時(shí)常需要對(duì)自己或接收到的數(shù)據(jù)進(jìn)行一定的排序拼接后, 然后進(jìn)行或加密或校驗(yàn)的處理,雖然寫死順序可以解決問題,但代碼缺少了靈活性。
本文從通用性角度,以golang語言來處理一般情況下的字符串拼接問題。
目前已開發(fā)成專門的拼接工具go-join,歡迎使用并提出意見。
拼接處理
目前經(jīng)常遇到的排序方式主要有以下兩種:
1、參數(shù)名ASCII碼從小到大排序
以下是微信開發(fā)者平臺(tái)的簽名要求:
簽名生成的通用步驟如下:
第一步,設(shè)所有發(fā)送或者接收到的數(shù)據(jù)為集合M,將集合M內(nèi)非空參數(shù)值的參數(shù)按照參數(shù)名ASCII碼從小到大排序(字典序),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
特別注意以下重要規(guī)則:
◆ 參數(shù)名ASCII碼從小到大排序(字典序);
◆ 如果參數(shù)的值為空不參與簽名;
◆ 參數(shù)名區(qū)分大小寫;
◆ 驗(yàn)證調(diào)用返回或微信主動(dòng)通知簽名時(shí),傳送的sign參數(shù)不參與簽名,將生成的簽名與該sign值作校驗(yàn)。
◆ 微信接口可能增加字段,驗(yàn)證簽名時(shí)必須支持增加的擴(kuò)展字段
//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"))
示例結(jié)果:
str : appid=wx_1234535&body=test data&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&test data&572836589&kdjskgjokghdk&http://www.baidu.com&2745890486870&192.169.0.1&100&MWEB
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"))
示例結(jié)果:
str3 : appid=wx_1234535&body=test data&mch_id=572836589¬ify_url=http://www.baidu.com
str4 : wx_1234535&test data&572836589&http://www.baidu.com
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例
這篇文章主要為大家介紹了GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理
這篇文章主要介紹了詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
jenkins配置golang?代碼工程自動(dòng)發(fā)布的實(shí)現(xiàn)方法
這篇文章主要介紹了jenkins配置golang?代碼工程自動(dòng)發(fā)布,jks是個(gè)很好的工具,使用方法也很多,我只用了它簡(jiǎn)單的功能,對(duì)jenkins配置golang相關(guān)知識(shí)感興趣的朋友一起看看吧2022-07-07
go local history本地歷史恢復(fù)代碼神器
這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Golang 操作TSV文件的實(shí)戰(zhàn)示例
本文主要介紹了Golang 操作TSV文件的實(shí)戰(zhàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
go語言中GOPATH GOROOT的作用和設(shè)置方式
這篇文章主要介紹了go語言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-05-05

