利用golang语言怎么对http协议与get进行拼接
创始人
2024-12-26 21:41:20
0次

我就废话不多说了,大家还是直接看代码吧~

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=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 被排除的参数名,不参与排序及拼接
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_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.按照特定的参数顺序拼接

//JoinStringsInOrder 数名按固定顺序排列后拼接
//data 待拼接的数据
//sep 连接符
//onlyValues 是否只包含参数值,true则不包含参数名,否则参数名和参数值均有
//orders 按照顺序的参数名,没有的不参与拼接
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_1234535&body=test data&mch_id=572836589¬ify_url=http://www.baidu.com

str4 : wx_1234535&test data&572836589&http://www.baidu.com

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...