130 lines
3.8 KiB
Go
130 lines
3.8 KiB
Go
/*
|
||
url的格式如下:https://cmq-{$type}-{$region}.api.{$network}.com
|
||
其最终内容受到以下因素的影响:地域、网络、消息队列模型
|
||
|
||
地域
|
||
gz(广州)、sh(上海)、bj(北京)、shjr(上海金融)、szjr(深圳金融)、hk(中国香港)、cd(成都)、ca(北美)、usw(美西)、use(美东)、in(印度)、th(泰国)、sg(新加坡)
|
||
|
||
网络
|
||
外网接口请求域名后缀:api.qcloud.com
|
||
内网接口请求域名后缀:api.tencentyun.com
|
||
|
||
队列模型
|
||
请参照下面说明将域名中的 {$region} 替换成相应地域:
|
||
外网接口请求域名:https://cmq-queue-{$region}.api.qcloud.com
|
||
内网接口请求域名:http://cmq-queue-{$region}.api.tencentyun.com
|
||
|
||
主题模型
|
||
请参照下面说明将域名中的 {$region} 替换成相应地域:
|
||
外网接口请求域名:https://cmq-topic-{$region}.api.qcloud.com
|
||
内网接口请求域名:http://cmq-topic-{$region}.api.tencentyun.com
|
||
*/
|
||
package mqMgr
|
||
|
||
import (
|
||
"fmt"
|
||
"strings"
|
||
|
||
"goutil/securityUtil"
|
||
"goutil/stringUtil"
|
||
"goutil/webUtil"
|
||
)
|
||
|
||
func getPrefix(network string) string {
|
||
if network == MQ_NETWORK_INTERNAL {
|
||
return "http://"
|
||
}
|
||
|
||
return "https://"
|
||
}
|
||
|
||
// // 获取请求url
|
||
// // region:地域
|
||
// // network:网络类型:内网、外网
|
||
// // _type:消息队列类型:消息队列、消息主题
|
||
// // 返回:
|
||
// // 请求url
|
||
// func getHost(region, network, _type string) string {
|
||
// url := "cmq-{$type}-{$region}.api.{$network}.com"
|
||
// url = strings.Replace(url, "{$region}", region, 1)
|
||
// url = strings.Replace(url, "{$network}", network, 1)
|
||
// url = strings.Replace(url, "{$type}", _type, 1)
|
||
|
||
// return url
|
||
// }
|
||
|
||
// 获取请求url todo:切换成tdmq之后需要用这个方法
|
||
// region:地域
|
||
// network:网络类型:内网、外网
|
||
// _type:消息队列类型:消息队列、消息主题
|
||
// 返回:
|
||
// 请求url
|
||
func getHost(region, network, _type string) string {
|
||
var url string = ""
|
||
if network == MQ_NETWORK_INTERNAL {
|
||
url = "{$region}.mqadapter.cmq.{$network}.com"
|
||
} else {
|
||
url = "cmq-{$region}.public.{$network}.com"
|
||
}
|
||
|
||
url = strings.Replace(url, "{$region}", region, 1)
|
||
url = strings.Replace(url, "{$network}", network, 1)
|
||
|
||
return url
|
||
}
|
||
|
||
func getPath() string {
|
||
return "/v2/index.php"
|
||
}
|
||
|
||
func getMethod() string {
|
||
return "POST"
|
||
}
|
||
|
||
// AssembleUrl 组装请求url
|
||
// 参数
|
||
// region:地域
|
||
// network:网络类型:内网、外网
|
||
// _type:消息队列类型:消息队列、消息主题
|
||
// secretKey:密钥的key
|
||
// paramMap:参数字典
|
||
// 返回值
|
||
// string:组装好的请求url
|
||
// string:签名
|
||
// error:错误
|
||
func AssembleUrl(region, network, _type, secretKey string, paramMap map[string]string) (url, signature string, err error) {
|
||
// 1. 申请安全凭证(已经得到)
|
||
|
||
// 2. 生成签名串
|
||
// 2.1、对参数排序
|
||
// 2.2、拼接请求字符串
|
||
// 注意:
|
||
// “参数值”为原始值而非 url 编码后的值。
|
||
// 若输入参数中包含下划线,则需要将其转换为“.”。(指的是参数的名称,不是参数的值)
|
||
paramStr := webUtil.AssembleRequestParamSort(paramMap, true)
|
||
|
||
// 2.3、拼接签名原文字符串
|
||
host := getHost(region, network, _type)
|
||
path := getPath()
|
||
signatureSource := fmt.Sprintf("%s%s%s?%s", getMethod(), host, path, paramStr)
|
||
|
||
// 2.4、生成签名串
|
||
data, err := securityUtil.HmacSha256(signatureSource, secretKey)
|
||
if err != nil {
|
||
return
|
||
}
|
||
signature = string(stringUtil.Base64Encode2(data))
|
||
|
||
// 3. 签名串编码
|
||
// 注意:
|
||
// 生成的签名串并不能直接作为请求参数,需要对其进行 URL 编码。
|
||
// 如果用户的请求方法是 GET,则对所有请求参数值均需要做 URL 编码。
|
||
// 如果是POST,则不用进行URL编码
|
||
// signature = url.QueryEscape(signature)
|
||
|
||
// 将签名添加到参数集合中
|
||
url = fmt.Sprintf("%s%s%s", getPrefix(network), host, path)
|
||
|
||
return
|
||
}
|