golang语言http协议get拼接参数操作

作者:wilsonyx 时间:2024-05-08 10:45:10 

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


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&notify_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&notify_url=http://www.baidu.com

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/qq_30505673/article/details/106879789

标签:golang,http,get,参数
0
投稿

猜你喜欢

  • python计算牛顿迭代多项式实例分析

    2022-10-27 05:32:37
  • python中redis查看剩余过期时间及用正则通配符批量删除key的方法

    2023-08-02 12:12:27
  • Python使用LRU缓存策略进行缓存的方法步骤

    2023-09-03 05:00:06
  • vue 使用微信jssdk,调用微信相册上传图片功能

    2024-05-02 17:09:36
  • python如何代码集体右移

    2023-07-08 01:34:28
  • antd table按表格里的日期去排序操作

    2024-04-28 10:55:56
  • python数据分析之单因素分析线性拟合及地理编码

    2021-02-09 06:46:20
  • mysql、mssql及oracle分页查询方法详解

    2024-01-21 15:11:34
  • Python局部函数及用法详解(含nonlocal关键字)

    2023-07-26 05:02:52
  • js实现的牛顿摆效果

    2024-04-29 13:25:45
  • Linux下编译安装python3步骤

    2021-11-07 17:50:04
  • Python3利用print输出带颜色的彩色字体示例代码

    2022-09-08 07:53:29
  • pycharm 使用心得(三)Hello world!

    2022-10-08 09:59:56
  • Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法

    2024-04-30 09:58:23
  • MySQL中存储的数据查询的时候如何区分大小写

    2024-01-21 12:01:27
  • mysql中模糊查询的四种用法介绍

    2024-01-23 17:03:02
  • PHP程序员最常犯的11个MySQL错误

    2012-01-05 19:13:02
  • python中str内置函数用法总结

    2022-06-23 10:22:45
  • 17个asp常用的正则表达式

    2008-01-15 18:58:00
  • Python用csv写入文件_消除空余行的方法

    2022-04-01 09:24:57
  • asp之家 网络编程 m.aspxhome.com