目前在一家云计算公司做测试,所以会接触阿里云的一些相关知识,其中就包括调用阿里云的open API,当然也有封装好的sdk,像python,java的,都是有sdk,不过没看到有go语言的sdk,所以研究了下这方面的知识,目前正好可以使用,就和大家分享分享,以便帮助需要的同学.
用途:
为什么要调用阿里的open API,其实做测试有的时候一些数据,还是需要自己去获取或制造的,写个什么脚本啊,与云计算相关的都要用到。
案例:
以发送邮件为例子,阿里云每天有200封的免费额度可以使用,像个人网站就可以用用,找回密码什么的就可以用阿里云的邮件推送服务好了,先看看这个邮件发送接口的参数(详情可以去阿里云帮助文档找到产品邮件推送),有些是必填,有些是可选的,其中有一项比较重要的就是签名(不过这个是包含在公共参数中)
接口参数:
公共参数:
看下面代码:
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strings"
"time"
)
const (
//这里需要替换成自己的,我就用星号代替了
AccessKeyId = "******"
secret = "*****"
)
var Aliyun map[string]interface{}
func PercentEncode(str string) string {
//替换字符串
str = strings.Replace(str, "+", "%20", -1)
str = strings.Replace(str, "*", "%2A", -1)
str = strings.Replace(str, "%7E", "~", -1)
return str
}
func CreateSignature(secret, StringToSign string) string {
//创建签名
key := []byte(secret + "&")
mac := hmac.New(sha1.New, key)
mac.Write([]byte(StringToSign))
s := base64.StdEncoding.EncodeToString(mac.Sum(nil))
return s
}
func GetUtcTime() string {
//获取utc时间
now := time.Now()
year, mon, day := now.UTC().Date()
hour, min, sec := now.UTC().Clock()
s := fmt.Sprintf("%d-%02d-%02dT%02d:%02d:%02dZ", year, mon, day, hour, min, sec)
return s
}
func SendMail(toaddress, htmlbody, subject string) *map[string]interface{} {
urldata := url.Values{}
//获取utc时间
utc := GetUtcTime()
//把请求参数一一添加起来
urldata.Add("Action", "SingleSendMail")
urldata.Add("AccountName", "admin@testwd.cn")
urldata.Add("ReplyToAddress", "true")
urldata.Add("AddressType", "1")
urldata.Add("ToAddress", toaddress)
urldata.Add("FromAlias", "测试阿里云openAPI")
urldata.Add("Subject", subject)
urldata.Add("HtmlBody", htmlbody)
urldata.Add("Format", "JSON")
urldata.Add("Version", "2015-11-23")
urldata.Add("SignatureMethod", "HMAC-SHA1")
urldata.Add("SignatureNonce", utc)
urldata.Add("SignatureVersion", "1.0")
urldata.Add("AccessKeyId", AccessKeyId)
urldata.Add("Timestamp", utc)
fmt.Println(urldata.Encode())
//参数encode编码,并替换参数中的特殊字符
percent := PercentEncode(urldata.Encode())
//获取待签名数据
StringToSign := "GET" + "&" + url.QueryEscape("/") + "&" + url.QueryEscape(percent)
//生成签名值
Signature := CreateSignature(secret, StringToSign)
//把签名内容带到请求参数中
urldata.Add("Signature", Signature)
//发起get请求
res, err := http.Get("https://dm.aliyuncs.com/?" + PercentEncode(urldata.Encode()))
if err != nil {
fmt.Println(err)
}
//读取完成后关闭链接
defer res.Body.Close()
//读取返回的数据
data, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
}
//json解析响应的数据
json.Unmarshal(data, &Aliyun)
return &Aliyun
}
func main() {
fmt.Println(SendMail("jiangyd@jiagouyun.com", "hello,测试窝", "测试窝演示"))
}
运行代码,必须有安装配置golang环境:
发送邮件截图

总结:通过这个示例,可以学习到sha1加密,http发送get请求,json解析相关知识,我相信再调用其它阿里的openapi应该是没什么问题的
