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¬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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_30505673/article/details/106879789


猜你喜欢
- 发送端可以不停的发送新文件,接收端可以不停的接收新文件。例如:发送端输入:e:\visio.rar,接收端会默认保存为 e:\new_vis
- 前言cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪
- 如下所示:beta分布的最大特点是其多样性, 从下图可以看出, beta分布具有各种形态, 有U形, 类似正态分布的形状, 类似unifor
- Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和Z
- 每次卷积神经网络训练的结果都只保存了最后一部分,查阅了一下相关资料,发现是定义saver时采用的默认值,这里进行如下设置: saver =
- mysql数据通过data文件恢复mysql磁盘文件被损坏,无法启动,能看到data文件,在没有备份的话如何复原?情景1:知道数据库中的表结
- 前言:1、gevent库可以轻松实现并发同步或异步编程。gevent中使用的主要模式是Greenlet,它是以C扩展模块的形式访问Pytho
- Default.aspx<%@ Page Language="C#" AutoEventWireup="
- PyQt5多行文本框控件QTextEdit简介QTextEdit类是一个多行文本框控件,可以显示多行文本内容,当文本内容超出控件显示范围时,
- 关于php的引用(就是在变量或者函数、对象等前面加上&符号)的作用,我们先看下面这个程序。<?php
- 学习Python Web和Django开发不能只学习Python。我们有时必需借助其它技术比如AJAX实现我们想要的功能。今天我们就要利用D
- 概念第一步:计算一个梯度 Ix,Iy第二步:整合矩阵,计算特征值第三步:比较特征值的大小第四步: 非极大值抑制,把真正的角点留下来,角点周围
- 利用MySQLfs这个工具,我么可以在MySQL关系数据库中存储文件系统。MySQLfs将文件系统中文件的字节内容分解成数据库中的元组,而数
- 注意:index.html再次声明变量的时候注意空格的问题来源:https://blog.csdn.net/guofeng93/articl
- 一、导言导语:在计算机进行数据交换时,常常会有一个进制转换的过程,我们知道计算机只认0 和 1.在内存系统中,基本基于二进制进行运算的,但是
- 1.数据库约束约束是关系型数据库提供的一种校验数据合法性的机制. 1.1 约束类型约束类型说明示例null使用not null 指
- 一、介绍QQ空间相册的个性化利器,能对照片进行效果的优化、文字编辑等等。从设计上使用了创新的手法,尽量减少用户的思考。其中,通过界面的特殊表
- 前言在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引
- 前言:我们想要在爬虫中使用xpath、beautifulsoup、正则表达式,css选择器等来提取想要的数据,但是因为scrapy是一个比较
- 函数 &n