目前在一家云计算公司做测试,所以会接触阿里云的一些相关知识,其中就包括调用阿里云的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应该是没什么问题的