• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang语言http协议get拼接参数操作

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

    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=6000987market=sh

    补充: golang常见字符串拼接通用处理方式

    前言

    我们在日常开发中,尤其是对接第三方登录、支付、分享等功能时,时常需要对自己或接收到的数据进行一定的排序拼接后, 然后进行或加密或校验的处理,虽然写死顺序可以解决问题,但代码缺少了灵活性。

    本文从通用性角度,以golang语言来处理一般情况下的字符串拼接问题。

    目前已开发成专门的拼接工具go-join,欢迎使用并提出意见。

    拼接处理

    目前经常遇到的排序方式主要有以下两种:

    1、参数名ASCII码从小到大排序

    以下是微信开发者平台的签名要求:

    签名生成的通用步骤如下:

    第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1key2=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_1234535body=test datamch_id=572836589nonce_str=kdjskgjokghdknotify_url=http://www.baidu.comout_trade_no=2745890486870spbill_create_ip=192.169.0.1total_fee=100trade_type=MWEB
    str2 : wx_1234535test data572836589kdjskgjokghdkhttp://www.baidu.com2745890486870192.169.0.1100MWEB
    

    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_1234535body=test datamch_id=572836589notify_url=http://www.baidu.com

    str4 : wx_1234535test data572836589http://www.baidu.com

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

    您可能感兴趣的文章:
    • golang gopm get -g -v 无法获取第三方库的解决方案
    • golang实现各种情况的get请求操作
    • Golang发送http GET请求的示例代码
    • Golang执行go get私有库提示"410 Gone" 的问题及解决办法
    • golang使用http client发起get和post请求示例
    • 完美解决golang go get私有仓库的问题
    上一篇:Goland调节字体大小的设置(编辑区,terminal区,页面字体)
    下一篇:浅谈golang for 循环中使用协程的问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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